如何在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中这样做,请帮助我。
谢谢&问候, 阿图尔
答案 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)
根据https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select:
“Hive不支持WHERE子句中的IN,EXISTS或子查询。”
答案 3 :(得分:3)
我正在使用配置单元0.7.1
和SELECT * 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。