当列为空时,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_VSIG2_V 列的输出中,具有空值/无值的列也在先前的 SIG 值中获得值。每当SIG1_VSIG2_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

连接多列且一列为空时的空格 - Oracle

当php中的数组为空时,json_encode函数不返回大括号

Hive 分析函数lead、lag实例应用

Hive分析函数LAG和LEAD详解