在多列上应用窗口函数

Mar*_*rko 6 apache-spark apache-spark-sql

我想执行窗口函数(具体来说是移动平均),但要在数据帧的所有列上执行。

我可以这样做

from pyspark.sql import SparkSession, functions as func

df = ...

df.select([func.avg(df[col]).over(windowSpec).alias(col) for col in df.columns])
Run Code Online (Sandbox Code Playgroud)

但恐怕这不是很有效。有没有更好的方法来做到这一点?

小智 0

另一种可能更好的替代方法是创建一个新的 df,在其中按窗口函数中的列进行分组并对剩余列应用平均值,然后执行左连接。对于 df 溢出到磁盘(或无法持久保存在内存中)的大型数据帧,这肯定会更优化。