并认识到Hive查询不支持IN / EXIST运算符,他们建议使用LEFT SEMI JOIN作为替代。你知道原因吗?
答案 0 :(得分:3)
Hive支持in / exists运算符,但不支持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)
答案 1 :(得分:3)
这让我想起了Eric Lippert所提出的问题“为什么C#没有Java功能X?”人们不会通过从另一个语言开始并删除内容来构建语言,而是从零开始并决定要实现哪些功能。
在某些时候,hive既不支持IN \ EXISTS子查询,也不支持LEFT SEMI JOIN。然后,有人suggested they add LEFT SEMI JOIN。现在,这是在语言中,它消除了实现IN \ EXISTS子查询的一些原因,因为两者在语义上是等价的。
答案 2 :(得分:0)
FWIW,Hive似乎支持IN运营商:
=IF(
NOT(
ISERROR(
MATCH(200,RentLogs[Item ID],0)
)
),
INDEX(RentLogs[Check In Date],
MATCH(200,RentLogs[Item ID],0)
),
200 & " not found in RentLog"
)
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF