我看看Hive 语言手册
并认识到 Hive 查询不支持 IN/EXIST 运算符,他们建议使用 LEFT SEMI JOIN 作为替代。你知道原因吗?
Hive 支持 in/exist 运算符,但不支持带有 in 的子查询in
。
作为替代方案,您可以使用左半连接。
以下在 Hive 中是不可能的
SELECT a.key, a.value
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
上面可以使用左半连接重写。
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
这让我想起了 Eric Lippert 提出的“为什么 C# 没有 Java 特性 X?”形式的问题。人们不会通过从另一种语言开始并删除东西来构建一种语言,他们从一无所有开始并决定要实现哪些功能。
在某些时候,hive 既不支持 IN\EXISTS 子查询,也不支持 LEFT SEMI JOIN。然后,有人建议他们添加 LEFT SEMI JOIN。既然这是在语言中,它消除了实现 IN\EXISTS 子查询的一些原因,因为两者在语义上是等价的。
FWIW,Hive 似乎支持 IN 运算符:
A IN (val1, val2, ...) TRUE if A is equal to any of the values.
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF