apache-spark - 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 中执行此操作?
解决方案
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()
该解决方案假定数据框中的每个日期都有一行,而两者之间没有丢失日期。如果没有,请在应用窗口函数之前按日期聚合行。
推荐阅读
- python - 读取包含/不包含特定字符的 csv 文件
- python - 加载 RandomForestClassifier 时的性能问题
- firebase - 如果我在 Angular 中使用相同的查询,则 Firebase 查询在 Admin 中不起作用。为什么会有这种差异?
- postgresql - TimescaleDB:如何在 CASE 语句中使用 time_bucket_gapfill
- web-scraping - 无法网页抓取导致找不到表单元素
- api - 我希望我的订单现在自动添加从 gloriafood 到 epos 的 POS
- reactjs - 如何通过多步formik表单使用react-select/creatable
- reactjs - 更改平面列表 onpress 中按钮的背景颜色
- html - HTML 标签在 iOS 中比 Android 占用更多的新行空间
- wordpress - 当我访问我的网站时出现不需要的登录弹出窗口