ハイブでのバケット結合の適切な使用例が見つからないようです。
私が見ているように、テーブルAをテーブルBと結合する場合:
バケット結合により、テーブルBを分散キャッシュにロードしながらテーブルAをリデューサーに渡す時間を節約し、各マッパーはテーブルBの対応するバケットとテーブルのバケットを処理しますA.
ただし、テーブル B の分散キャッシュへのロードは単一のタスクによって行われるため、テーブルが大きくなると、これがボトルネックになります。
したがって、テーブル B が単一のタスクに負担をかけないほど小さい場合、小さな最適化で通常のマップ結合を行うのと実質的に同じです。
一方、テーブル B が全体を持つ 1 つのマッパーに収まらない場合は、分散キャッシュへの読み取りプロセスに時間がかかる可能性があります。
最後に、マッパーからリデューサーにテーブル A のバケットを渡す必要がないため、テーブル B を分散キャッシュにロードする時間は価値があると思われますが、テーブル A各マッパーは単一のレデューサーに対応する単一のバケットを読み取るため (テーブルは結合キーによってバケット化されます)、各レデューサーは 2 つの中間出力をフェッチします (テーブルごとに 1 つ、レデューサーが対応するマッパーと同じノード)、それらをマージします。この時点から、結合はマッパーの場合と同じです。
結論として、問題は何がより多くの費用がかかるかだと思います:
- 1 つのタスクで中程度のサイズのテーブルを分散キャッシュにロードする
- マッパーからリデューサー (ほとんどローカル) に中程度の (場合によっては大きい) サイズのバケットを多数渡し、2 つのファイルをマージします。これらはすべて並行して行われます。
どう思いますか?誰かがバケットに参加するための良い使い方を見つけることができますか?