参考サイト
同じテーブルをスキャンする回数を減らす
INSERT OVERWRITE TABLE hoge_1 SELECT col1, COUNT(col1) FROM org_tbl GROUP BY col0; INSERT OVERWRITE TABLE hoge_2 SELECT col1, SUM(col1) FROM org_tbl GROUP BY col0;
マルチインサートを用いて書き換えると次のようになる
FROM (SELECT col1, COUNT(col1) count_col1, SUM(col1) sum_col1 FROM org_tbl GROUP BY col0) t INSERT OVERWRITE TABLE hoge_1 SELECT t.col1, t.count_col1 INSERT OVERWRITE TABLE hoge_1 SELECT t.col1, t.sum_col1;
・FROM句で同じテーブルを参照する複数のINSERT文をまとめて実行することで、
同じテーブルのスキャンが1回で済ませられる。
・集約関数を含むとreduceタスクが展開され、各INSERT OVERWRITE文は個別ジョブに展開されてしまうが、
サブクエリで集約処理した結果をFROM句に指定した場合、マルチインサートが適用される。
インデックス
やることリスト
基本ポイント
・Mapタスクのみで完結させる
・mapサイトジョインを使用する
・Shuffleフェーズに流れるデータ量を抑制する
・圧縮を検討しているてみる
・LEFT SEMI JOIN
・COUNT関数の使用が必要な場合、結果が「1」とわかっているものは分けて、あとでUNION ALL
すると早くなるか実証
・同じテーブルをスキャンする回数を減らす
・マルチインサート
mapサイトジョイン使用前・使用後のEXPLAINの違い。reduceがなくなるのか
1reduceで実行しているhqlがないか確認
無駄にGROUP BYしてないか確認
UNIQUEJOINを使って3テーブルをJOINしてみる。使えたら使わずに実施したHQLと
比較(EXPLAIN・処理時間など)していみる
max関数の時間短縮 reduceを増やす
left semi
マルチインサートの実証
バケットの実証
集約関数がないmapフェーズだけのHQLに対してmap数を増やすと時間短縮するのかの実証
このサイトを読み解く
SQL感覚でHiveQLを書くと痛い目にあう例 Hive クエリを最適化する
参考書籍