HIVE WHERE NOT EXISTS 不比较 NULLS

Posted

技术标签:

【中文标题】HIVE WHERE NOT EXISTS 不比较 NULLS【英文标题】:HIVE WHERE NOT EXISTS doesn't compare NULLS 【发布时间】:2017-08-30 20:34:08 【问题描述】:

我试图只选择某些列值不同的行。我的问题是,如果我使用 =,它不会将列与空值进行比较,如果我将 = 替换为 Like,我会收到以下错误,有什么建议吗?两个表都有相同的列

不支持的子查询表达式子查询表达式同时引用父查询表达式和子查询表达式,并且不是有效的连接条件。 (状态=42000,代码=10249)

SELECT * 
FROM table1 t
where not exists(
select * from table2 l where t.loco_id=l.loco_id and
t.a=l.a and
t.b=l.b
);

【问题讨论】:

(1) 添加包含所需结果的数据样本(2) 哪一列可能为 NULL?一种?乙? loco_id?他们都是?其中一些? 【参考方案1】:
select  t.* 

from                table1 t

        left join   table2 l 

        on          t.loco_id   <=> l.loco_id 
                and t.a         <=> l.a 
                and t.b         <=> l.b

where   l.loco_id is null
;

A B 对于非空值,使用 EQUAL(=) 运算符返回相同的结果 操作数,但如果两者都为 NULL,则返回 TRUE,如果其中之一返回 FALSE 一片空白。 (从 0.9.0 版开始。)

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-RelationalOperators

【讨论】:

【参考方案2】:

null 在技术上意味着它的unknown

= 不比较 unknown-s;因为不可能比较它们...两个unknowns比较的结果是unknown

select assert_true( (null = null) is null  )

然而:

select assert_true( (null = null) )

会失败,因为结果是unknown(null)。

如果您仍想使用null-s 加入;我建议添加一些coalesce-s 以摆脱这些unknown-s。

【讨论】:

以上是关于HIVE WHERE NOT EXISTS 不比较 NULLS的主要内容,如果未能解决你的问题,请参考以下文章

Hive:在连接之前在子表中使用 where 子句是不是会提高性能?

Hive 多级分区并使用 where 子句进行选择

如何使用 HIVE 在 WHERE 语句中对 OR 子句进行分组

Hive实现删除部分数据 delete from where

Hive实现删除部分数据 delete from where

Hive 查询使用“not column=value”where 子句删除空值