我有以下数据
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都与正确的值匹配?
这可能会导致两个订单的顺序不同,后续合并会匹配错误的值吗?
答案 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...|
+---+--------------------+