sql - 为什么过滤器默认在 Spark 数据帧上删除空值?

标签 sql apache-spark null apache-spark-sql

包含 null 值的基本 scala 集合上的

filter 具有以下(且非常直观)行为:

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文档中没有明确说明?我错过了什么吗?

最佳答案

这是因为 SQL 的标准不是空安全的 - 所以 Spark SQL 遵循这一点(但 Scala 不遵循)。

Spark 数据帧具有空安全等式

scala> df.filter($"B" <=> null).show
+---+----+
|  A|   B|
+---+----+
|  a|null|
+---+----+


scala> df.filter(not($"B" <=> "d")).show
+---+----+
|  A|   B|
+---+----+
|  a|null|
+---+----+

编辑时注意:默认情况下不安全的一点是允许测试结果为空。缺失值是否等于“c”?我们不知道。一个缺失值是否等于另一个缺失值?我们也不知道。但在过滤器中,null 为 false。

关于sql - 为什么过滤器默认在 Spark 数据帧上删除空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113021/

相关文章:

mysql - MySQL 表上的并发读写

hadoop - 加入 Spark 输出错误的结果,而 map-side join 是正确的

swift - Nil Coalescing (??) 运算符在 swift 中是如何工作的?

r - 如何在 R 中创建多个空矩阵?

sql - 如何按行中两列中的较大值对数据集进行排序?

mysql - 在没有设置任何数据库的情况下,如何将 CSV 文件转换为基于 Web 的 SQL 数据库表?

sql - 计算销售价格以实现至少 10% 的利润

scala - Spark : Create temporary table by executing sql query on temporary tables

apache-spark - pyspark.mllib DenseMatrix 乘法

PHP/MySQL 插入空值