HiveQL中IN与NOT IN是否支持?Qubole环境下查询报错求助
HiveQL中IN/NOT IN支持情况及你的查询错误分析
嘿,作为HiveQL新手碰到这种问题太正常了!先给你拍板:HiveQL是完全支持IN和NOT IN语法的,Qubole平台上也一样支持——你遇到的错误根本不是IN子查询的锅,而是查询里藏着几个语法/逻辑问题。
先拆解你的错误原因:
- 首先看
AND NOT d.columnTwo这部分:Hive里NOT后面必须跟一个明确的布尔表达式,直接写NOT 列名是无效的。如果columnTwo是布尔类型,你可以写成NOT d.columnTwo(部分版本可能需要明确d.columnTwo = false);如果是字符串/数值类型,就得用比较运算符,比如d.columnTwo != '目标值'或者d.columnTwo IS NOT NULL,得根据你的业务逻辑来调整。 - 其次,查询里用到了
d.、h.这些别名,但你没在FROM/JOIN子句里给表定义对应的别名!比如d.columnOne的d,你得在FROM table1后面加上d(也就是FROM table1 d);而h.columnThree的h,如果这个列来自table2,你要么得把table2关联进来,要么就是笔误应该写成d.columnThree,不然Hive根本不知道h指的是哪个表。 - 最后,虽然Hive(包括Qubole上的版本)支持IN后面跟子查询,但如果你的Hive版本特别旧(比如0.13之前),子查询支持会有限制,但这大概率不是你现在的问题。
给你修正后的查询示例(假设h.columnThree是笔误,实际是table1的列,且columnTwo是要排除某个特定值):
SELECT DISTINCT vId FROM table1 d WHERE d.columnOne = "123" AND d.columnTwo != '需要排除的值' -- 替换成你的实际判断条件 AND d.timestamp BETWEEN 1523550000000 AND 1523930000000 AND NOT (d.columnThree REGEXP "000\\.000\\.000\\.00|111\\.111\\.111\\.11|222\\.22\\.222\\.22") -- 注意正则里的点要转义,不然会匹配任意字符 AND vId IN (SELECT vId FROM table2 WHERE colOne REGEXP "000|111|222")
如果你的Hive版本确实不支持IN子查询,或者想换一种更高效的写法,可以用JOIN替代:
SELECT DISTINCT d.vId FROM table1 d JOIN (SELECT DISTINCT vId FROM table2 WHERE colOne REGEXP "000|111|222") t2 ON d.vId = t2.vId WHERE d.columnOne = "123" AND d.columnTwo != '需要排除的值' AND d.timestamp BETWEEN 1523550000000 AND 1523930000000 AND NOT (d.columnThree REGEXP "000\\.000\\.000\\.00|111\\.111\\.111\\.11|222\\.22\\.222\\.22")
另外提醒下:正则表达式里的.是匹配任意字符的,如果你要匹配实际的点号,记得用\\.转义,不然你的IP匹配逻辑会出错哦!
内容的提问来源于stack exchange,提问作者noobeerp
相关产品推荐
相关产品推荐

