我在AWS中有一个名为table1
的Hive表,只有一列,如下所示:
COL1
(null)
active
尝试以下查询
select *
from table1
where COL1 NOT IN ('reversed')
Hive只返回一行
COL1
active
为什么不用(null)返回记录?
据我所知,修复方法是修改条件如下。但我想调试此问题,以便其他查询不会发生这种情况
where coalesce(COL1,"") NOT IN ('reversed')
答案 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 NULL
,IS NOT NULL
,COALESCE
等方法和函数,可让我们使用NULL
值