Hive多条件NOT EXISTS查询报错,请求解决方案
Hive EXISTS多条件查询报错及多条件IN替代方案
先回答你的第一个问题:Hive完全支持多条件的EXISTS查询,你遇到的报错不是因为多条件,而是子查询的逻辑或字段关联有问题。
看你的错误查询,子查询里的条件是:
t1.diagonosiscode2 = t2.dx AND t1.diagonosiscode3 = t2.dx AND ... AND t1.diagonosiscode25 = t2.dx
这个逻辑本身就有问题:你要求t2.dx同时等于t1的24个不同字段的值,这几乎不可能满足(除非这些字段的值完全一致);另外注意你字段拼写有错误:diagonosiscode应该是diagnosiscode(少了一个字母a),这也可能导致Hive找不到对应字段,进而触发“子查询未关联”的语义错误。
如果你真正的需求是**t1的diagnosiscode2到diagnosiscode25这些字段中,没有任何一个值存在于t2.dx中**,那正确的NOT EXISTS写法应该用OR连接条件(而非AND):
SELECT * FROM Data t1 WHERE NOT EXISTS ( SELECT 1 FROM Data2 t2 WHERE t2.dx = t1.diagnosiscode2 OR t2.dx = t1.diagnosiscode3 OR t2.dx = t1.diagnosiscode4 -- 依次写到t1.diagnosiscode25 )
如果字段太多写起来麻烦,更优雅的方式是用LATERAL VIEW EXPLODE把t1的多个诊断码字段转成多行,再关联t2:
SELECT t1.* FROM Data t1 WHERE NOT EXISTS ( SELECT 1 FROM ( -- 把t1的多个诊断码字段转成单行值 SELECT t1.id, dx_val FROM Data t1 LATERAL VIEW EXPLODE( ARRAY( diagnosiscode2, diagnosiscode3, diagnosiscode4, diagnosiscode5, diagnosiscode6, diagnosiscode7, diagnosiscode8, diagnosiscode9, diagnosiscode10, diagnosiscode11, diagnosiscode12, diagnosiscode13, diagnosiscode14, diagnosiscode15, diagnosiscode16, diagnosiscode17, diagnosiscode18, diagnosiscode19, diagnosiscode20, diagnosiscode21, diagnosiscode22, diagnosiscode23, diagnosiscode24, diagnosiscode25 ) ) exploded AS dx_val ) t1_exploded JOIN Data2 t2 ON t1_exploded.dx_val = t2.dx WHERE t1_exploded.id = t1.id -- 关联原表的唯一标识字段 )
再回答第二个问题:Hive不支持多条件IN(比如IN ((col1, col2), (col3, col4))这种语法),可以用以下几种方案替代:
1. 用JOIN替代多条件IN
如果要匹配多个字段的组合,直接用JOIN关联这些字段即可:
SELECT t1.* FROM table1 t1 JOIN ( SELECT target_col1, target_col2 FROM table2 -- 多条件的目标集合 ) t2 ON t1.col1 = t2.target_col1 AND t1.col2 = t2.target_col2
2. 用字段拼接+单条件IN
如果字段类型允许拼接,把多个字段用一个唯一分隔符拼接成字符串,再用IN:
SELECT * FROM table1 -- 用|作为分隔符,确保字段本身不包含这个字符 WHERE CONCAT(col1, '|', col2) IN ( SELECT CONCAT(target_col1, '|', target_col2) FROM table2 )
3. 用EXISTS替代多条件IN
和JOIN逻辑类似,用EXISTS关联多个字段:
SELECT * FROM table1 t1 WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t1.col1 = t2.target_col1 AND t1.col2 = t2.target_col2 )
内容的提问来源于stack exchange,提问作者Vini
相关产品推荐
相关产品推荐

