python - Spark DataFrame 聚合和分组多个列,同时保留顺序

标签 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 都与正确的值匹配?

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

最佳答案

正如@Raphael所评论的,您可以首先将value1value2列组合成一个struct类型列,然后收集列表:

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...|
+---+--------------------+

关于python - Spark DataFrame 聚合和分组多个列,同时保留顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829276/

相关文章:

java - Spark 可以预初始化重型第三方库吗?

python - 如何从具有多级列的数据框中绘制散点 FacetGrid

python - 将 pandas 数据框转换为元组列表并删除所有 pandas 数据类型

python - 无法返回我想要的列表

python - 如何在 Python 中的列表中安排不同时间的操作

mapreduce - Spark中 "RDDs can be stored in memory"是什么意思?

python - 从 Pandas DataFrame 列获取列表元素

python - 使用多个关键字对象引用的 Django Rest Framework 对象

python - `Docker logs` 错误地显示为空,直到容器停止

apache-spark - 在 Apache Spark 中求解大型线性系统