0

私はハイブが初めてで、バケット化とMapSide結合について読んでいました

「マップ結合は、バケット化されたテーブル (バケット) を利用できます。これは、左側のテーブルのバケットで作業しているマッパーが、結合を実行するために右側のテーブルの対応するバケットをロードするだけでよいためです。結合の構文は、インメモリ....」

次のようにテーブルを作成するとします

CREATE TABLE bucketed_users (id INT, name STRING) CLUSTERED BY (id) INTO 4 BUCKETS;

私の質問は

1> 4 つのバケットすべてが同じサイズになるかどうか それともデータ内のidの頻度に依存しますか? つまり、ID が何度も繰り返される場合、関連するバケットは他のバケットよりも大きなサイズになります。

2> ID に関連するデータが 2 つの異なるバケットに存在するシナリオはありますか? つまり、ID の 1 つのレコードがバケット 1 に存在し、別のレコードがバケット 4 に存在します。

はいの場合、オプティマイザーはバケット化されたデータをどのように処理しますか?

誰かがこれを試したことがあれば、彼らの経験を共有できれば素晴らしいことです.

4

1 に答える 1

1

この質問は少し前に尋ねられましたが、まだ最初のヒットの 1 つだったので、これは他の人の助けになるかもしれません。

ほとんどの場合、テーブルを作成するだけで、クラスター上に 1 つのフラット ファイルが作成されます。Hive で実行するすべてのクエリは、Map and Reduce ジョブに変換されます。定義上、reduce ステージに入るにはキーと値が必要であり、各マッパーは単一のフラット ファイルのチャンクを検索して、指定されたキーと値を検出する必要があります。

バケット化されたテーブルを使用する場合、Hive はクラスター化された値 (ここでは id を使用) のハッシュを取得し、単一のテーブルを多数のフラット ファイルに分割します。テーブルは ID のハッシュによって分割されるため、各分割のサイズはテーブルの値に基づきます。3 番目のバケットにマップされる値がない場合、そのフラット ファイルは空になります。また、insert ステートメントの前に hive.enforce.bucketing = true を設定するのを忘れない限り、特定の ID が複数のバケットに表示されることはありません。

バケット化は、データのサンプリングと、cluster by の列を検索条件として使用する select ステートメントの高速化に非常に役立ちます。クラスター化された列で 2 つのテーブルを結合し、同じ (または倍数の) バケットがある場合にも改善が見られます。

うまくいけば、これで混乱が解消されます。

于 2014-09-02T15:11:02.927 に答える