首页 > 解决方案 > spark - 获取过去 N 条记录的平均值,不包括当前记录

问题描述

给定我拥有的 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,那么在给定的一天,该值应该是EXCLUDING当前记录的最后 3 个值的平均值

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

我如何有效地使用 useover()子句以便在 Spark 中执行此操作?

标签: apache-spark

解决方案


PySpark 解决方案。

窗口定义应3 PRECEDING AND 1 FOLLOWING转换为(-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()

该解决方案假定数据框中的每个日期都有一行,而两者之间没有丢失日期。如果没有,请在应用窗口函数之前按日期聚合行。


推荐阅读