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中的用法
时间: 2024-10-11 21:59:07