web-dev-qa-db-ja.com

Hiveはをサポートしていません。存在します。次のクエリを作成するにはどうすればよいですか?

2つのテーブルAとBがあり、どちらも列IDを持っています。 Bに存在しないIDをAから取得したいと思います。明らかな方法は次のとおりです。

SELECT id FROM A WHERE id NOT IN (SELECT id FROM B)

残念ながら、Hiveはin、exists、またはsubqueriesをサポートしていません。結合を使用して上記を実現する方法はありますか?

私は次のことを考えました

SELECT A.id FROM A,B WHERE A.id<>B.id

しかし、AのどのIDとも等しくないIDがBに常に存在するため、これはA全体を返すように見えます。

10
elexhobby

HiveのLEFT OUTER JOINでも同じことができます。

SELECT A.id
FROM A
LEFT OUTER JOIN B
ON (B.id = A.id)
WHERE B.id IS null
25
Charles Menguy

Hiveは、0.13からINNOT INEXIST、およびNOT EXISTSをサポートしているようです。

select count(*)
from flight a
where not exists(select b.tailnum from plane b where b.tailnum = a.tailnum);

EXISTNOT EXISTSのサブクエリには、相関する述語が必要です(上記のサンプルのb.tailnum = a.tailnumなど)。詳細については、 Hive Wiki> WHERE句のサブクエリ を参照してください。

5
Sangmoon Oh

INを次のように実行したい場合:

SELECT id FROM A WHERE id IN (SELECT id FROM B)

ハイブはこれをLEFT SEMI JOINでカバーしています:

SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
3
fdrijver

spark sqlを使用できる場合は、左アンチ結合を使用できます。

例:SELECT A.id FROM A left anti join B on a.id = b.id

1
ravi teja