首页 > 解决方案 > PySpark group by collect_list 在一个窗口上

问题描述

我有一个包含多列的数据框。我正在尝试通过窗口函数使用按 id 分组的 collect_list 聚合几列。我正在尝试这样的事情:

exprs = [(collect_list(x).over(window)).alias(f"{x}_list") for x in cols]
df = df.groupBy('id').agg(*exprs)

我收到以下错误:

表达式既不存在于 group by 中,也不是聚合函数。如果您不在乎获得哪个值,请添加到分组依据或包装在 first() (或 first_value)中

如果我对单个列执行相同操作,而不是针对多个列,它正在工作。

标签: pyspark

解决方案


我找到了一种方法。我想,窗口函数不适用于agg(*exprs)操作。所以,我将上面的内容修改为

for col_name in cols:
    df = df.withColumn(col_name + "_list", collect_list(col(col_name)).over(window_spec))

这达到了我的目的。

谢谢你。


推荐阅读