spark-获取除当前记录以外的过去N条记录的平均值

时间:2019-06-13 20:57:41

标签: apache-spark

给出我拥有的Spark数据框

val df = Seq(
("2019-01-01",100),
("2019-01-02",101),
("2019-01-03",102),
("2019-01-04",103),
("2019-01-05",102),
("2019-01-06",99),
("2019-01-07",98),
("2019-01-08",100),
("2019-01-09",47)
).toDF("day","records")

我想为此添加一个新列,以便获得给定日期的最后N条记录的平均值。例如,如果N = 3,则在给定的一天,该值应为当前记录的最近3个值EXCLUDING的平均值

例如,对于第2019-01-05天,它将是(103+102+101)/3

为了在Spark中做到这一点,我如何有效地使用over()子句?

1 个答案:

答案 0 :(得分:1)

PySpark解决方案。

窗口定义应为3 PRECEDING AND 1 PRECEDING,这将转换为包含两个边界的位置(-3,-1)

from pyspark.sql import Window
from pyspark.sql.functions import avg
w = Window.orderBy(df.day)
df_with_rsum = df.withColumn("rsum_prev_3_days",avg(df.records).over(w).rowsBetween(-3, -1))
df_with_rsum.show()

该解决方案假定数据框中每个日期有一行,而中间没有日期丢失。如果不是,请在应用窗口功能之前按日期汇总行。