Я применяю функцию 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 |
+-----------------------------------------------------------------+
Возможно ли это? Цените любые выводы!