sql中的exist in在hive中的用法

Hive不支持where子句中的子查询,SQL常用的exist in子句需要改写。

 

这一改写相对简单。考虑以下SQL查询语句: 

SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B);

改写成:

SELECT a.key, a.value FROM a LEFT OUTER JOIN b ON (a.key = b.key) WHERE b.key <> NULL;

解释:先做左连接,结果形如:

aaa  111

bbb  222

ccc   null

ddd  null

然后再过滤掉key为null的,剩下的就是表a的key在表b中存在的。

 

一个更高效的实现是利用left semi join改写为:

SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key);

限制条件:JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

sql中的exist in在hive中的用法,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。