为啥过滤器默认在火花数据帧上删除空值?
Posted
技术标签:
【中文标题】为啥过滤器默认在火花数据帧上删除空值?【英文标题】:why does filter remove null value by default on spark dataframe?为什么过滤器默认在火花数据帧上删除空值? 【发布时间】:2018-03-05 14:45:59 【问题描述】:filter
在包含 null
值的基本 scala 集合上具有以下(并且非常直观)行为:
scala> List("a", "b", null).filter(_ != "a")
res0: List[String] = List(b, null)
但是,我很惊讶地发现以下过滤器会删除 spark 数据帧中的空值:
scala> val df = List(("a", null), ( "c", "d")).toDF("A", "B")
scala> df.show
+---+----+
| A| B|
+---+----+
| a|null|
| c| d|
+---+----+
scala> df.filter('B =!= "d").show
+---+---+
| A| B|
+---+---+
+---+---+
如果我想保留null
值,我应该添加
df.filter('B =!= "d" || 'B.isNull).show
+---+----+
| A| B|
+---+----+
| a|null|
+---+----+
就个人而言,我认为默认删除空值很容易出错。 为什么选择这个?为什么没有在 api 文档中明确说明?我错过了什么吗?
【问题讨论】:
与***.com/questions/36131942/…相关 【参考方案1】:这是因为 SQL 的标准不是 null 安全的 - 所以 Spark SQL 遵循这一点(但不是 Scala)。
Spark 数据帧虽然具有 null 安全相等性
scala> df.filter($"B" <=> null).show
+---+----+
| A| B|
+---+----+
| a|null|
+---+----+
scala> df.filter(not($"B" <=> "d")).show
+---+----+
| A| B|
+---+----+
| a|null|
+---+----+
编辑中的注意事项:默认情况下不安全的点是允许 null 作为测试的结果。缺失值是否等于“c”?我们不知道。缺失值是否等于另一个缺失值?我们也不知道。但在过滤器中,null 为假。
【讨论】:
以上是关于为啥过滤器默认在火花数据帧上删除空值?的主要内容,如果未能解决你的问题,请参考以下文章
仅当非空值时,如何在输入和过滤数据中具有默认的 NULL 值?