hive の join と partition されたテーブル


「えー?そうだったの?」って感じなのだが、単純に join しちゃうと、全部の partition をなめに行くっぽい。
たとえば、テーブルhoge,fugaがあり、Aはカラムmonth でパーティションされているとしよう。
このとき、

SELECT *
FROM hoge A
LEFT OUTER JOIN fuga B on (A.id=B.id)
WHERE A.month = 201206

もしくは、

SELECT *
FROM hoge A
LEFT OUTER JOIN B fuga on (A.month = 201206 AND A.id=B.id)

とすると、Aのmonth = 201206 のパーティションだけでなく、全てのパーティションを見に行ってしまう。
パーティション使うにはサブクエリ使うしかなさそう。

SELECT *
FROM (SELECT * FROM hoge WHERE month = 201206) A
LEFT OUTER JOIN B on (A.id=B.id)

なお、ここではサブクエリは SELECT * してるが、メインクエリで一部のカラムしか使わないのなら、必要なカラムだけSELECTするようにしないとディスクアクセスの無駄になる。

2013/4/9
今は主に CDH4.1.3 を使っていますが、もう上記のような点は改善されていて、必要なパーティションだけ読むようになっているようです。