pyspark - 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)中
如果我对单个列执行相同操作,而不是针对多个列,它正在工作。
解决方案
我找到了一种方法。我想,窗口函数不适用于agg(*exprs)
操作。所以,我将上面的内容修改为
for col_name in cols:
df = df.withColumn(col_name + "_list", collect_list(col(col_name)).over(window_spec))
这达到了我的目的。
谢谢你。
推荐阅读
- javascript - Window.open - 覆盖浏览器窗口选项卡
- php - Ajax 文件上传适用于 xampp,但不适用于在线服务器
- ruby - 通过 ssh 运行命令时尊重 rbenv
- html - 角 | Bootstrap - 模式上的关闭功能
- compiler-errors - 为什么编译器说我正在应用许多参数?
- elasticsearch - 无法在 mac 上启动 kibana。“apm”插件的设置生命周期未在 30 秒内完成
- javascript - 如果文件不存在,即使设置了错误处理程序,jQuery ajax 也会出错
- eclipse - 条件时如何用Column重写这个Scala
- apache-camel - 从 Camel JMS 组件向 AMQ Artemis 发送消息时无法创建会话工厂 AMQ219007
- matlab - 边界超像素和邻接矩阵