Hive命令执行NOT IN子句

Blu*_*ond 6 hadoop hive

我有两个表,tab1和tab2.

tab1(T1)  tab2(T2)
a1         b1
b1         c1
c1         f1
d1         g1
Run Code Online (Sandbox Code Playgroud)

我正在寻找T2中不存在的表T1中的值.在这种情况下,输出应该是a1 d1

我已尝试使用以下查询但无法获得正确的解决方案.

select distinct tab1.T1 from tab1 left semi join tab2 on (tab1.T1!=tab2.T2);
Run Code Online (Sandbox Code Playgroud)

jav*_*dba 17

SELECT t1.str
FROM tab1 t1 
LEFT OUTER JOIN tab2 t2 ON t1.str = t2.str
WHERE t2.str IS NULL;
Run Code Online (Sandbox Code Playgroud)

结果:

OK
a1
d1
Run Code Online (Sandbox Code Playgroud)

"为什么t2.str那里是空条件":左外连接确保第一个表中的所有值都包含在结果中.那么当第二个表中没有值时会发生什么:在这种情况下,第二个表中的所有列都报告为null.

因此,在上面的情况下,我们正在精确搜索第二个表项缺失的情况 - 因此我们:

  • 从表2中选择一个永不空(又名非空)列.
  • 那么:数字是一个永远存在的列?如果没有,那么请选择另一个
  • 指定条件"table1-alias"."table1-never-null-column"= null.这意味着记录实际上不存在于连接条件中 - 因此我们发现记录仅存在于表1中.