为什么"select unix_timestamp('')为null"当"select unix_timestamp('')"返回null时返回false?

slh*_*sen 2 hadoop hive apache-spark apache-spark-sql

使用Spark 1.6.2并尝试查找字段是否包含空字符串或日期值.

Spark文档解释说,如果unix_timestamp()函数失败,则返回null,因此需要以下行为:

sqlContext.sql("select unix_timestamp('')").show
+----+
| _c0|
+----+
|null|
+----+
Run Code Online (Sandbox Code Playgroud)

但是当我尝试用"is null"检查它时,它返回false:

sqlContext.sql("select unix_timestamp('') is null").show
+-----+
|  _c0|
+-----+
|false|
+-----+
Run Code Online (Sandbox Code Playgroud)

相同的查询在Hive中返回true:

hive> select unix_timestamp('') is null;
OK
true
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里是空的null检查:

sqlContext.sql("select null is null").show
+----+
| _c0|
+----+
|true|
+----+
Run Code Online (Sandbox Code Playgroud)

use*_*411 5

这是一个错误,看起来它已经在Spark 2.x分支中解决(可能使用SPARK-12054)问题的根源是由返回的模式unix_timestamp.如果你执行:

sqlContext.sql("select unix_timestamp('')").printSchema
Run Code Online (Sandbox Code Playgroud)

你会看到的:

root
 |-- _c0: long (nullable = false)
Run Code Online (Sandbox Code Playgroud)

由于模式报告为未nullable检查值,unix_timestamp(...).isNull因此始终为false.