Spark DataFrame在保留顺序的同时聚合和分组多列

时间:2017-10-19 11:53:44

标签: python apache-spark dataframe pyspark apache-spark-sql

我有以下数据

id | value1 | value2 
-----------------------
1         A       red
1         B       red
1         C      blue
2         A      blue
2         B      blue
2         C     green

我需要的结果是:

id |                       values
---------------------------------
 1      [[A,red],[B,red][C,blue]]
 2   [[A,blue],[B,blue][C,green]]

到目前为止,我的方法是在单独的数组中对value1和value2进行分组和聚合,然后按照Combine PySpark DataFrame ArrayType fields into single ArrayType field

中的描述将它们合并在一起
df.groupBy(["id"]).agg(*[F.collect_list("value1"), F.collect_list("value2")])

但是,由于collect_list()无法保证订单(请参阅here),如何确保value1和value2都与正确的值匹配?

这可能会导致两个订单的顺序不同,后续合并会匹配错误的值吗?

1 个答案:

答案 0 :(得分:3)

正如@Raphael评论的那样,您可以先将 value1 value2 列合并到一个struct类型列中,然后再合并collect_list

import pyspark.sql.functions as F

(df.withColumn('values', F.struct(df.value1, df.value2))
   .groupBy('id')
   .agg(F.collect_list('values').alias('values'))).show()

+---+--------------------+
| id|              values|
+---+--------------------+
|  1|[[A,red], [B,red]...|
|  2|[[A,blue], [B,blu...|
+---+--------------------+