Поведение функции Lag в scala, когда столбец нулевой - PullRequest
1 голос
/ 14 октября 2019

Я применяю функцию lag к столбцу в моем фрейме данных. Столбец, к которому применяется функция lag, уже содержит некоторые нулевые значения. Как исключить вычисление lag для строк, которые имеют нулевое значение?

Ниже приведены данные из фрейма данных:

+------------+-------------+-----+-----+
| NUM_ID     | TIME        |SG1_V|SG2_V|
+------------+-------------+-----+-----+
|XXXXX01     |1570167499000|     |79.0 |
|XXXXX01     |1570167502000|     |88.0 |
|XXXXX01     |1570167503000|80.0 |99.0 |
|XXXXX01     |1570179810000|81.0 |     |
|XXXXX01     |1570179811000|92.0 |     |
+------------+-------------+-----+-----+

Я написал функцию lag, как показано ниже, чтобы получитьпредыдущее значение строки вместе с текущим значением:

val w = org.apache.spark.sql.expressions.Window.partitionBy("NUM_ID").orderBy("TIME")  
val leadDF = df2.withColumn("PREVIOUS_SG1", lag("SG1_V", 1, 0).over(w)).withColumn("PREVIOUS_SG2", lag("SG2_V", 1, 0).over(w))

Я получаю следующий вывод:

+------------+-------------+------------+-----+------------+------+
| NUM_ID     | TIME        |PREVIOUS_SG1|SG1_V|PREVIOUS_SG2|SG2_V |
+------------+-------------+------------+-----+------------+------+
|XXXXX01     |1570167499000|            |     |     0      |99.0  |
|XXXXX01     |1570167502000|    0       | 78.0|  99.0      |      |
|XXXXX01     |1570167503000|    78.0    |     |            |85.0  |
|XXXXX01     |1570179810000|            |81.0 |  85.0      |81.0  |
|XXXXX01     |1570179811000|    81.0    |92.0 |  81.0      |      |
|XXXXX01     |1570179833000|    92.0    |     |            |77.0  |
+-----------------------------------------------------------------+

Здесь в выводе для столбца SIG1_V и SIG2_V, которыйимеют значение NULL / нет также получает значение в предыдущем значении SIG. Можно ли как-то исключить задержку, когда столбцы SIG1_V и SIG2_V имеют значение NULL / нет значения?

Ожидаемый результат показан ниже.

+------------+-------------+------------+-----+------------+------+
| NUM_ID     | TIME        |PREVIOUS_SG1|SG1_V|PREVIOUS_SG2|SG2_V |
+------------+-------------+------------+-----+------------+------+
|XXXXX01     |1570167499000|            |     |     0      |99.0  |
|XXXXX01     |1570167502000|    0       | 78.0|            |      |
|XXXXX01     |1570167503000|            |     |            |85.0  |
|XXXXX01     |1570179810000|            |81.0 |  85.0      |81.0  |
|XXXXX01     |1570179811000|    81.0    |92.0 |            |      |
|XXXXX01     |1570179833000|            |     |            |77.0  |
+-----------------------------------------------------------------+

Возможно ли это? Цените любые выводы!

1 Ответ

0 голосов
/ 14 октября 2019

Удалите значения, которые вам не нужны, после вычисления лагов вместо того, чтобы пытаться исключить их во время вычисления. Это можно сделать, установив значения столбцов отставания на ноль, если исходный столбец равен нулю:

leadDF.withColumn("PREVIOUS_SG1", when($"SG1_V".isNull, $"SG1_V").otherwise($"PREVIOUS_SG1"))
  .withColumn("PREVIOUS_SG2", when($"SG2_V".isNull, $"SG2_V").otherwise($"PREVIOUS_SG2"))
...