在Spark中使用前导窗口功能时是否可以忽略空值

Joh*_*ohn 3 scala apache-spark apache-spark-sql

我的数据框是这样的

id  value  date    
1   100    2017 
1   null   2016 
1   20     2015 
1   100    2014
Run Code Online (Sandbox Code Playgroud)

我想获取最新的先前值,但忽略null

id  value  date   recent value
1   100    2017    20
1   null   2016    20
1   20     2015   100
1   100    2014   null
Run Code Online (Sandbox Code Playgroud)

使用引导窗口功能时,有什么方法可以忽略空值。

hi-*_*zir 5

在Spark中使用前导窗口功能时是否可以忽略空值

它不是。

我想获取最新值,但忽略null

只需将last(或first)与ignoreNulls

def last(columnName: String, ignoreNulls: Boolean): Column

聚合函数:返回组中列的最后一个值。

默认情况下,该函数返回其看到的最后一个值。当ignoreNulls设置为true时,它将返回它看到的最后一个非空值。如果所有值都为null,则返回null。

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions._

val df = Seq(
  (1, Some(100), 2017), (1, None, 2016), (1, Some(20), 2015), 
  (1, Some(100), 2014)
).toDF("id", "value", "date")

df.withColumn(
  "last_value",
   last("value", true).over(Window.partitionBy("id").orderBy("date"))
).show

+---+-----+----+----------+                                                     
| id|value|date|last_value|
+---+-----+----+----------+
|  1|  100|2014|       100|
|  1|   20|2015|        20|
|  1| null|2016|        20|
|  1|  100|2017|       100|
+---+-----+----+----------+
Run Code Online (Sandbox Code Playgroud)

  • 回答我自己的问题:在这种情况下,您需要使用(在 SQL 中)`over(partition by id order by date rows between unbounded previous and 1 prior)`。不知道如何将其翻译成 Scala (2认同)