PySpark 中的累积移动平均线

时间:2021-04-05 22:42:23

标签: pyspark

我有一个数据框:

df = spark.createDataFrame([(1, 30),(2, 40),(3, 50)],["rank", "value"])

行按排名排序,我想添加一列,该列具有每行中值列的累积移动平均值。

在这个例子中,第一行是 30 (30/1),第二行是 35 ((30+40)/2),第三行是 40 ((30+40+50)/3)。< /p>

我可以通过使用窗口来做到这一点:

w = (Window.orderBy(F.col("rank")).rangeBetween(-100, 0))
df_with_cma = df.withColumn('avg_val', F.avg("value").over(w))

问题是我的实际数据集非常大(约 5000 万行),并且由于使用 Window 强制使用单个节点,这需要很长时间(我在几个小时后停止了该过程)。

>

有人可以建议更好的方法吗?

具体来说,如果我可以添加一列是前几行的平均值 (prev_line_avg),我可以添加一列

(prev_line_avg*(rank-1)+value)/rank

从而不必每次都遍历所有以前的值。

只是我不知道是否/如何添加 prev_line_avg 而不先添加一个需要 prev_line_avg 的平均值列,然后我们进入无限递归(鸡和蛋问题)。

帮助?

谢谢!!!

0 个答案:

没有答案
相关问题