给出我拥有的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()
子句?
答案 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()
该解决方案假定数据框中每个日期有一行,而中间没有日期丢失。如果不是,请在应用窗口功能之前按日期汇总行。