web-dev-qa-db-ja.com

Hiveでサブクエリを作成して "In"句を使用する方法

HiveでIn句を使用するにはどうすればよいですか?しかし、私はそれを行う方法を見つけていません。

これをHiveで行いたいです。誰かがHiveでこれを行う方法を知っているなら助けてください。

ありがとう、よろしく、Atul

17
user722856

https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+Select

「HiveはWHERE句でIN、EXISTS、またはサブクエリをサポートしていません。」

あなたが見たいと思うかもしれません: https://issues.Apache.org/jira/browse/Hive-801

https://issues.Apache.org/jira/browse/Hive-1799

7
Luis R.

準結合を使用できます( 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)
36
www

Hive 0.13はWHERE節でIN/EXISTSをサポートするようになりました。問題 https://issues.Apache.org/jira/browse/Hive-784 は4年後に解決されました:)

18
Gaurav Kohli

Hiveバージョン_0.7.1_およびSELECT * FROM MYTABLE WHERE MYCOLUMN IN ('thisThing','thatThing');を使用しています

列型STRINGでこれをテストしたので、上記のWawrzyniecのように、Hive言語マニュアルではサポートされていないと_LEFT SEMI JOIN_ですが、私のテストではうまくいきました。

3
Engineiro

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にのみ存在し、t2にはないt1の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;
0
Azam Khan

Hiveは、Hive 0.13以降、制限の少ないIN/EXISTSステートメントをサポートしています。詳細については https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+SubQueries を参照してください。

0
Serg

HiveはINを完全にサポートしています... WHERE句のサブクエリはサポートしていません

4年前からFacebookエンジニアからのオープン機能チケットがあります... https://issues.Apache.org/jira/browse/Hive-784?focusedCommentId=13579059

0
Guido Serra