Spark Условная функция задержки над окном - PullRequest
3 голосов
/ 20 марта 2020

У меня есть фрейм данных, где значение label связано с (id, bin, date, hour):

+----------+----+-----+---+-------------------+
|      date|hour|   id|bin|              label|
+----------+----+-----+---+-------------------+
|2019_12_20|   8|    1|  0|  151.7050821002368|
|2019_12_20|   8|    1|  2| 101.13672140015788|
|2019_12_20|   8|    1|  3| 16.856120233359647|
...

Я хочу добавить несколько столбцов к этому фрейму данных, соответствующих label, в один и тот же час на предыдущий день, час go предыдущего дня и др. c. Я знаю, как получить первое с помощью функции задержки:

val dateWindow = Window.partitionBy($"id", $"bin").orderBy($"hour", $"date")
val expandedDf = data.withColumn("yesterdaySameHour", lag($"label", 1, 0.0).over(dateWindow))

Однако я не могу понять, как получить значение label при hour - 1 в предыдущий день. Есть ли способ получить условную задержку, когда я могу отфильтровать hour, который больше или равен часу текущей строки? Если нет, то как правильно это сделать?

Большое спасибо.

1 Ответ

1 голос
/ 21 марта 2020

Вы должны указать функцию Window в соответствии с вашей целью. Возможно, вам придется использовать функцию lag дважды.

import org.apache.spark.sql.expressions.Window

val dW = Window.partitionBy("id", "bin", "hour").orderBy("date")
val hW = Window.partitionBy("id", "bin", "date").orderBy("hour")

df.withColumn("yesterdaySameHour", lag("label", 1, 0.0).over(dW))
  .withColumn("todayPreviousHour", lag("label", 1, 0.0).over(hW))
  .withColumn("yestedayPreviousHour", lag(lag("label", 1, 0.0).over(dW), 1, 0.0).over(hW))
  .orderBy("date", "hour", "bin")
  .show(false)

Это даст вам результат:

+----------+----+---+---+-----+-----------------+-----------------+--------------------+
|date      |hour|id |bin|label|yesterdaySameHour|todayPreviousHour|yestedayPreviousHour|
+----------+----+---+---+-----+-----------------+-----------------+--------------------+
|2019_12_19|7   |1  |0  |-1   |0                |0                |0                   |
|2019_12_19|7   |1  |2  |-2   |0                |0                |0                   |
|2019_12_19|7   |1  |3  |-3   |0                |0                |0                   |
|2019_12_19|8   |1  |0  |1    |0                |-1               |0                   |
|2019_12_19|8   |1  |2  |2    |0                |-2               |0                   |
|2019_12_19|8   |1  |3  |3    |0                |-3               |0                   |
|2019_12_20|7   |1  |0  |4    |-1               |0                |0                   |
|2019_12_20|7   |1  |2  |5    |-2               |0                |0                   |
|2019_12_20|7   |1  |3  |6    |-3               |0                |0                   |
|2019_12_20|8   |1  |0  |7    |1                |4                |-1                  |
|2019_12_20|8   |1  |2  |8    |2                |5                |-2                  |
|2019_12_20|8   |1  |3  |9    |3                |6                |-3                  |
+----------+----+---+---+-----+-----------------+-----------------+--------------------+
...