2

我看看Hive 语言手册

并认识到 Hive 查询不支持 IN/EXIST 运算符,他们建议使用 LEFT SEMI JOIN 作为替代。你知道原因吗?

4

3 回答 3

5

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)

检查这个

于 2013-06-07T12:35:01.673 回答
4

这让我想起了 Eric Lippert 提出的“为什么 C# 没有 Java 特性 X?”形式的问题。人们不会通过从另一种语言开始并删除东西来构建一种语言,他们从一无所有开始并决定要实现哪些功能。

在某些时候,hive 既不支持 IN\EXISTS 子查询,也不支持 LEFT SEMI JOIN。然后,有人建议他们添加 LEFT SEMI JOIN。既然这是在语言中,它消除了实现 IN\EXISTS 子查询的一些原因,因为两者在语义上是等价的。

于 2013-06-07T18:04:26.177 回答
1

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

于 2017-11-01T16:18:02.180 回答