当列为空时,Scala 中的 Lag 函数的行为
Posted
技术标签:
【中文标题】当列为空时,Scala 中的 Lag 函数的行为【英文标题】:Behaviour of Lag function in scala when the column is null 【发布时间】:2019-10-14 04:57:03 【问题描述】:我在我的数据框中的列上应用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
列的输出中,具有空值/无值的列也在先前的 SIG 值中获得值。每当SIG1_V
和SIG2_V
列为空/无值时,是否有任何方法可以排除滞后?
预期的输出如下所示。
+------------+-------------+------------+-----+------------+------+
| 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 |
+-----------------------------------------------------------------+
这可能吗?感谢任何潜在客户!
【问题讨论】:
试试这个它会让你得到你想要的输出 var leadDF= df2.withColumn("PREVIOUS_SG1", when($"SG1_V".isNull,"").otherwise(lag("SG1_V", 1, 0).over(w))).withColumn("PREVIOUS_SG2",when($"SG2_V".isNull,"").otherwise(lag("SG2_V", 1, 0).over(w))) .show 【参考方案1】:在计算滞后后删除您不想要的值,而不是在计算期间尝试排除它们。这可以通过在原始列为空时将滞后列的值设置为空来完成:
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"))
【讨论】:
以上是关于当列为空时,Scala 中的 Lag 函数的行为的主要内容,如果未能解决你的问题,请参考以下文章
当 Spring Boot 中的某些列为空时,@LastModifiedDate 不会更新
SpringDataForCassandra:当数据库中的 Int 列设置为空时,实体中的 NullPointerEx