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全体を返すように見えます。
HiveのLEFT OUTER JOIN
でも同じことができます。
SELECT A.id
FROM A
LEFT OUTER JOIN B
ON (B.id = A.id)
WHERE B.id IS null
Hiveは、0.13からIN
、NOT IN
、EXIST
、およびNOT EXISTS
をサポートしているようです。
select count(*)
from flight a
where not exists(select b.tailnum from plane b where b.tailnum = a.tailnum);
EXIST
とNOT EXISTS
のサブクエリには、相関する述語が必要です(上記のサンプルのb.tailnum = a.tailnum
など)。詳細については、 Hive Wiki> WHERE句のサブクエリ を参照してください。
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)
spark sqlを使用できる場合は、左アンチ結合を使用できます。
例:SELECT A.id FROM A left anti join B on a.id = b.id