將 dataframe
利用 pyspark
列合併爲一行,相似於 sql
的 GROUP_CONCAT
函數。例如以下 dataframe
:html
+----+---+ | s| d| +----+---+ |abcd|123| | asd|123| +----+---+
須要按照列相同的列 d
將 s
合併,想要的結果爲: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]| +---+-----------+