【问题标题】:Spark DataFrame aggregate and groupby multiple columns while retaining orderSpark DataFrame 在保持顺序的同时聚合和分组多列
【发布时间】:2018-03-31 10:55:15
【问题描述】:

我有以下数据

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

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

【问题讨论】:

  • 我会在收集之前将这两个值打包在一个结构中(从 Spark 2.0 开始工作,至少在 scala api 中)

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


【解决方案1】:

正如@Raphael 所说,您可以先将 value1value2 列组合成一个 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...|
+---+--------------------+

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多