Hadoopクラスターがあり、クエリにHiveを使用していますが、そのうちの1つに小さなバケットがある2つの大きなテーブルを結合したいのですが、読んだところによると、両方のテーブルを結合キーでバケット化すると、パフォーマンスが向上するようです。 。
だから私の設定は次のとおりです。
- 結合キーの両方のテーブルを同じ数のバケットにバケット化し、
- 小さいテーブルのバケツはメモリに収まります、
- set hive.optimize.bucketmapjoin = true;
- 次のクエリを実行します。
SELECT /*+ MAPJOIN(a) */
count(*)
FROM a JOIN B ON a.join_key = b.join_key;
質問1:上記の設定はバケットマップの参加をトリガーするのに十分ですか?
質問2:バケットマップ結合についての私の理解は、各バケットのハッシュテーブルを作成し、ハッシュされたバケットを各マッパーにアップロードするローカルタスクを開始することです。この理解は正しいですか?
質問3:上記の理解が正しければ、なぜHiveはローカルでハッシュを行うのですか?なぜ生のバケットをアップロードせず、マップタスクでハッシュを実行するので、並列処理と高速化を実現できますか?