将 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]| +---+-----------+