码迷,mamicode.com
首页 > 其他好文 > 详细

pyspark列合并为一行

时间:2018-12-29 17:14:33      阅读:416      评论:0      收藏:0      [点我收藏+]

标签:ORC   rom   初始化   created   sele   dataframe   6.2   collect   --   

dataframe 利用 pyspark 列合并为一行,类似于 sqlGROUP_CONCAT 函数。例如如下 dataframe :

+----+---+
|   s|  d|
+----+---+
|abcd|123|
| asd|123|
+----+---+

需要按照列相同的列 ds 合并,想要的结果为:

+---+-----------+
|  d|     newcol|
+---+-----------+
|123|[abcd, xyz]|
+---+-----------+

利用 groupby 去实现就好,spark 里面可以用 concat_ws 实现,可以看这个 Spark中SQL列合并为一行,而这里的 concat_ws 合并缺很奇怪,官方文档的实例为:

>>> df = spark.createDataFrame([('abcd','123')], ['s', 'd'])
>>> df.select(concat_ws('-', df.s, df.d).alias('s')).collect()
[Row(s=u'abcd-123')]

作者自己尝试得到:

from pyspark.sql import SparkSession
from pyspark.sql.functions import concat_ws

# 初始化spark会话
spark = SparkSession     .builder     .appName("test")     .master("local")     .getOrCreate()

df = spark.createDataFrame([('abcd','123'),('xyz','123')], ['s', 'd'])
df.show()
df.select(concat_ws('-', df.s, df.d).alias('newcol')).show()
+--------+
|  newcol|
+--------+
|abcd-123|
| xyz-123|
+--------+

不是想要的效果。而 collect_list 能得到相同的效果:

from pyspark.sql import SparkSession
from pyspark.sql.functions import concat_ws
from pyspark.sql.functions import collect_list

# 初始化spark会话
spark = SparkSession     .builder     .appName("test")     .master("local")     .getOrCreate()

df = spark.createDataFrame([('abcd','123'),('xyz','123')], ['s', 'd'])
df.show()
df.groupBy("d").agg(collect_list('s').alias('newcol')).show()

得到的结果为:

+---+-----------+
|  d|     newcol|
+---+-----------+
|123|[abcd, xyz]|
+---+-----------+

pyspark列合并为一行

标签:ORC   rom   初始化   created   sele   dataframe   6.2   collect   --   

原文地址:https://www.cnblogs.com/TTyb/p/10196544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!