pyspark列合併爲一行

dataframe 利用 pyspark 列合併爲一行,相似於 sqlGROUP_CONCAT 函數。例如以下 dataframe :html

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

須要按照列相同的列 ds 合併,想要的結果爲:python

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

利用 groupby 去實現就好,spark 裏面能夠用 concat_ws 實現,能夠看這個 Spark中SQL列合併爲一行,而這裏的 concat_ws 合併缺很奇怪,官方文檔的實例爲:sql

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

做者本身嘗試獲得:apache

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 能獲得相同的效果:api

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()

獲得的結果爲:app

+---+-----------+
|  d|     newcol|
+---+-----------+
|123|[abcd, xyz]|
+---+-----------+
相關文章
相關標籤/搜索