如何编写子查询并在Hive中使用“In”子句

时间:2011-10-06 16:16:43

标签: hadoop hive

如何在Hive中使用In子句 我想在Hive中写这样的东西   从y中选择x,其中y.z in(从y中选择不同的z)按x排序; 但我没有找到任何办法...... 我在Hive 0.7中尝试了In子句它抛出了错误,我也尝试了Find_in_Set .. 使用find_in_set(y.z,子查询)..但是工作失败了。

我想在Hive上这样做。如果有人知道如何在Hive中这样做,请帮助我。

谢谢&问候, 阿图尔

7 个答案:

答案 0 :(得分:34)

您可以使用半联接(https://cwiki.apache.org/Hive/languagemanual-joins.html):

LEFT SEMI JOIN以有效的方式实现相关的IN / EXISTS子查询语义。由于Hive目前不支持IN / EXISTS子查询,因此您可以使用LEFT SEMI JOIN重写查询。使用LEFT SEMI JOIN的限制是右侧表只应在连接条件(ON子句)中引用,而不能在WHERE-或SELECT子句等中引用。

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 :(得分:18)

Hive 0.13现在支持WHERE子句中的IN / EXISTS ..问题https://issues.apache.org/jira/browse/HIVE-784已在4年后解决了:)

答案 2 :(得分:7)

答案 3 :(得分:3)

我正在使用配置单元0.7.1SELECT * FROM MYTABLE WHERE MYCOLUMN IN ('thisThing','thatThing');

我在列类型STRING上对此进行了测试,因此我不确定这是否适用于所有数据类型,因为我注意到上面提到的Wawrzyniec,Hive语言手册说它不受支持而是使用LEFT SEMI JOIN但在我的测试中它运作良好。

答案 4 :(得分:0)

Hive完全支持IN ...它不支持WHERE子句中的子查询

Facebook工程师4年来就有一张开放的功能票...... https://issues.apache.org/jira/browse/HIVE-784?focusedCommentId=13579059

答案 5 :(得分:0)

假设table t1(id,name)table t2(id,name)

仅列出t2中存在的来自t1的ID(基本上是IN子句)

hive>select a.id from t1 a left semi join t2 b on (a.id=b.id);

仅列出t1中仅存在于t1但不存在于t2中的ID(基本上为NOT IN子句)

hive>select a.id from t1 a left outer join t2 b on(a.id=b.id) where b.id is null;

答案 6 :(得分:0)

Hive确实支持IN / EXISTS语句,因为Hive 0.13几乎没有限制。有关详细信息,请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries