Hive では、サイズの大きなテーブルをJOINする。
Hiveは、クエリの最後に出てくるテーブルを最大のテーブルと仮定し、 レコード結合をしながら他のテーブルをバッファした後、最後のテーブルをストリーム化しようとする。
■巨大なテーブルをJOINする場合
年月日でPartitionが区切られているtable_largeをJOINする時、 以下のようなクエリだと、JOINが先に評価され、JOIN後にWHERE節が働きます。
1
2
3
4
5
6
7
8
9
SELECT *
FROM
table_a AS t_a
LEFT OUTER JOIN
table_large AS t_l
ON (t_a.feature = t_l.feature)
WHERE
(t_l.year="2015" AND t_l.month="02" AND t_l.day="28") AND
t_a.column1="hoge"
以下のようにサブクエリで書き換えて、データ結合前にWHERE節で絞るのがベター。
1
2
3
4
5
6
7
8
9
10
SELECT *
FROM
table_a AS t_a
LEFT OUTER JOIN (
SELECT *
FROM table_large
WHERE (year="2015" AND month="02" AND day="28")
) AS t_l
ON (t_a.feature = t_l.feature)
WHERE t_a.column1="hoge"