Hive在NOT IN条件下自动过滤NULL

时间:2017-10-20 15:00:04

标签: apache-spark hive

我在AWS中有一个名为table1的Hive表,只有一列,如下所示:

COL1
(null)
active

尝试以下查询

select * 
from table1 
where COL1 NOT IN ('reversed')

Hive只返回一行

COL1
active

为什么不用(null)返回记录?

据我所知,修复方法是修改条件如下。但我想调试此问题,以便其他查询不会发生这种情况

where coalesce(COL1,"") NOT IN ('reversed')

1 个答案:

答案 0 :(得分:1)

这就是所有RDBMS系统处理null值的方式。

null具有特殊含义 - 类似于not defined

检查时:

COL1 NOT IN ('reversed')

将进行以下比较:

(null) != reversed
active != reversed
...

只会返回返回true的人:

scala> spark.sql("SELECT 'active' != 'reversed'").show
+-------------------------+
|(NOT (active = reversed))|
+-------------------------+
|                     true|
+-------------------------+


scala> spark.sql("SELECT null != 'reversed'").show
+---------------------------------------+
|(NOT (CAST(NULL AS STRING) = reversed))|
+---------------------------------------+
|                                   null|
+---------------------------------------+

您可以看到:(null) != 'reversed'没有返回true - 这就是您在结果集中看不到它的原因

此外:

scala> spark.sql("SELECT (null) = 'reversed'").show
+---------------------------------+
|(CAST(NULL AS STRING) = reversed)|
+---------------------------------+
|                             null|
+---------------------------------+

因此我们拥有IS NULLIS NOT NULLCOALESCE等方法和函数,可让我们使用NULL