2014-01-16 3 views
7

テーブルABの両方にパーティションキーとしてdsがあるとします。2つのテーブルを結合し、パーティションキーをフィルタリングするこれらの2つのHiveクエリのパフォーマンスに違いはありますか?

方法1

SELECT * 
FROM A JOIN B ON A.userid=B.userid 
WHERE A.ds='2014-01-01' AND B.ds='2014-01-01' 

方法2

SELECT * 
FROM (
SELECT * FROM A WHERE A.ds='2014-01-01' 
) JOIN (
SELECT * FROM B WHERE B.ds='2014-01-01' 
) ON 
A.userid=B.userid 

第二のクエリは速くなりますか?

WHEREJOINがHiveでどのように機能しているのでしょうか。できるだけ結合前にソーステーブルにwhere句を適用するか(上記のような句に1つのテーブルエイリアスが含まれている限り)、またはテーブルが結合された後にのみ適用されます(たとえばA.userid > B.useridを適用する必要があります)。参加後)?

答えて

3

あなたの質問は、ハイブの述語プッシュダウンに関するものです。
上記の場合、実行は、ハイブが述語A.ds='2014-01-01' AND B.ds='2014-01-01'を結合前にマッパーにプッシュするのとまったく同じになります。より一般的なケースでは

JOINは(内部結合)実際にはかなり簡単で、にまとめることができます:それはプッシュすることができた場合は
、それがプッシュします。
それが関与する唯一のテーブル(where a.x > 1)がある場合、述語をプッシュすることができ、関与する1つの以上のテーブルがある場合にプッシュすることができないが(A.userid > B.userid)は、マッパとしてテーブルのみ..

のうちの1つのスプリットを読み出し

より複雑な部分はOUTER JOINで、非常に明確に説明されていますhereです。

P.S.
述語プッシュダウンは、デフォルトではtrueであるhive.optimize.ppdによって制御されます。

+0

ありがとうございました! btw、このような深い詳細を議論するHiveの本はありますか? –

+1

oreillyの本は最も人気のあるものです(Google oreillyハイブ)。 Apacheのwikiとハイブメーリングリスト(http://hive.apache.org/mailing_lists.html)以外の情報源 – dimamah

関連する問題