Spark Scala - 7-дневная скользящая сумма - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть некоторые данные, по которым я хочу рассчитать 7-дневную скользящую сумму. Каждая строка для указанной c даты должна учитываться как 1 вхождение. Мой мыслительный процесс здесь заключается в том, чтобы использовать что-то вроде:

val myWindow = Window.orderBy("Date").rangeBetween(currentRow,days(7))
val myData = df.withColumn("Count",df.count().over(myWindow))

Но кусок rangeBetween не позволяет days(7), чтобы смотреть на 7 дней вперед от текущей даты.

Есть мысли?

Входные данные:

val df = Seq(
    ("08/04/2013",22),
    ("08/05/2013",24),
    ("08/06/2013",26),
    ("08/07/2013",29),
    ("08/08/2013",24),
    ("08/09/2013",24),
    ("08/10/2013",22),
    ("08/11/2013",24),
    ("08/11/2013",26)
    ).toDF("Date","Code")


+----------+----+
|      Date|Code|
+----------+----+
|08/04/2013|  22|
|08/05/2013|  24|
|08/06/2013|  26|
|08/07/2013|  29|
|08/08/2013|  24|
|08/09/2013|  24|
|08/10/2013|  22|
|08/11/2013|  24|
|08/11/2013|  26|
+----------+----+

Ожидаемый результат:

+----------+-----------+------+
|      Start|End|Amount|Count |
+----------+-----------+------+
|08/04/2013| 08/10/2013|7     |
|08/05/2013| 08/11/2013|8     |
+----------+-----------+------+

1 Ответ

0 голосов
/ 07 апреля 2020

Из Spark 2.3 вы должны использовать длинные значения с rangeBetween. Поскольку у одного дня есть 86400 секунды, вы можете express свой запрос как:

val myWindow = Window.orderBy("Date").rangeBetween(0, 7 * 86400)
val myData = df
  .withColumn("Date", to_date($"Date", "MM/dd/yyyy").cast("timestamp").cast("long"))
  .withColumn("Count", count($"*").over(myWindow))
  .withColumn("Date", $"Date".cast("timestamp").cast("date"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...