1

次のオプションを使用して、Hive マニュアル ( Bucketed Map Join )で説明されているように、ソートマージ結合を実行したいと思います

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;

両方のテーブルをバケット化し、結合列でソートする必要があります。私の質問は、並べ替えはグローバルである必要があるか、つまり、最初のバケットのキーが 2 番目のバケットのキーより少ないか、または各バケットが並べ替えられていれば十分かということです。

4

1 に答える 1

5

CLUSTERED BYテーブルを同じ列とSORTED BY同じ列で、同じ順序でINTO同じ量のバケットになるように定義する必要があります。
次に、リストしたとおりに上記の設定を設定し、x がテーブルの 1 つであるヒントを記述する必要があります。 また、両方のテーブルは結合句でそのまま結合する必要があり、最初に発生するサブクエリの後にデータがバケット化されソートされないため、結合前のサブクエリでは使用できません。 最後に、結合列は、テーブルがバケット化/ソートされる列でなければなりません。 /*+MAPJOIN(x)*/

データをテーブルに挿入するときは、hive.enforce.sorting設定 (true に設定) を使用するか、並べ替えコマンドを手動で記述できます。
Hive は、バケットが実際にソートされていることを確認しないため、そうでない場合、出力で間違った結果が生じる可能性があります。

各マッパーは、最初のテーブルからバケットを読み取り、2 番目のテーブルから対応するバケットを読み取り、マージソート結合を実行します。

あなたの質問に - いいえ、グローバルにソートする必要はありません。

PS
クエリを実行する前にEXPLAINコマンドを発行する必要があります。ハイブがマージソートバケット結合を行うかどうかを確認できます。

于 2013-07-11T16:29:30.080 に答える