искра - получить среднее значение за последние N записей, исключая текущую запись - PullRequest
0 голосов
/ 13 июня 2019

Учитывая данные кадра 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

Как я могу эффективно использовать предложение over() для того, чтобы сделать это в Spark?

1 Ответ

1 голос
/ 14 июня 2019

Решение 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()

Решение предполагает, что в кадре данных имеется одна строка на дату без промежуточных пропущенных дат. Если нет, агрегируйте строки по дате перед применением оконной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...