我正在尝试在现有列集上使用 groupby 聚合在 Pyspark 中创建一个新的列表列。下面提供了一个示例输入数据框:
------------------------
id | date | value
------------------------
1 |2014-01-03 | 10
1 |2014-01-04 | 5
1 |2014-01-05 | 15
1 |2014-01-06 | 20
2 |2014-02-10 | 100
2 |2014-03-11 | 500
2 |2014-04-15 | 1500
预期的输出是:
id | value_list
------------------------
1 | [10, 5, 15, 20]
2 | [100, 500, 1500]
列表中的值按日期排序。
我尝试使用 collect_list 如下:
from pyspark.sql import functions as F
ordered_df = input_df.orderBy(['id','date'],ascending = True)
grouped_df = ordered_df.groupby("id").agg(F.collect_list("value"))
但是即使我在聚合之前按日期对输入数据帧进行排序,collect_list 也不能保证顺序。
有人可以通过保留基于第二个(日期)变量的顺序来帮助进行聚合吗?
原文由 Ravi 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您将日期和值都收集为列表,则可以使用 and
udf
根据日期对结果列进行排序,然后仅保留结果中的值。