SQLは、接続テーブルサイズ前述の(効率を向上させるための第1の小テーブル)後の重要性を参加します

アドレスを参照します。https://blog.csdn.net/qq_30349961/article/details/82662550

     http://blog.sina.com.cn/s/blog_6ff05a2c01016j7n.html

多くの場合、いくつかの参照ハイブは、大きなテーブルと小さなテーブルが関連付けを行う際に、小さなテーブルEDITORIALが、これは作ることができると言わ最適化するための提案を協会より速いスピードハイブを述べた理由であるため、小さなテーブルが最初に置くことができると言いましたメモリに、その後、メモリに関連するクエリの最終完了したことを検出し、再び各大きなテーブルを記録しました。この理由は、合理的なようだが、慎重に、そして支持できないと。

どのように小さなテーブル小さなテーブルを数えますか?いわゆる小さなテーブルが行う方法のメモリに収まらない場合は?私が使用したクエリに関連した少数のレコードを行い、これは小さなテーブルであるべき、と見て2つのテーブルをログの実装はまだディスクの書き込み操作を減らしています。実際には、すべての受信を減らす書かれたディスクファイルのマージのすべてのキーと操作後のマップ出力の並べ替えがあるでしょう。ディスク(に書き込ま何回があるかもしれ流出)は、複数の一時ファイルを生成する可能性があるが、結局最終的にはそれぞれが1つのファイル、にマージされますつのファイルのみを減らします。

私は実験をしたテーブルとのレコードの300件の以上の万レコードがないテーブルそれは小さなテーブルの上にあるかどうか、参加する参加またはの前で合流後の、時間はほとんどすべて同じ実行します。その後に行く実行ログを減らし、テーブル内のレコードが前に参加したり、結合問合せ後2 ログがほとんど同じである減らします。あなたは上記の文に従った場合の表は、左側がメモリを待って置く参加したときに、その後、検出するために、メモリにテーブルの右側に参加する300の以上の万レコードのテーブルの左には参加し、メモリは確かにだけではなく入れそんなに記録ですその実行時間はで小さなテーブルよりも良いだろう、ディスクへの書き込みにバインドされている参加長い時間前に多くの魚が、それはそうではありません、それは上記の原因は言及して不合理なことを意味します。

実際には、「協会の前の小さなテーブルには、効率を改善するために行うことができ、」この文では、と言うことは、より正確である重複するキー関連の小さなテーブルが参加する以前の関連付けを改善するために行うことができます参加効率を。

分析根本的に2つの関連するテーブルのためのハイブが実現する方法です。どのように複雑に関係なくのでハイブのクエリは、最終的に変換されますMapReduceのジョブはので、実行するハイブが関連しているとし、達成するために同様の関連付けを実現するためのMapReduceを。そして、の関連付けを実現するためのMapReduceは、単に、キーと印に関連付けられている識別ビットは、左または右ジョインキーの組み合わせとして、(キー)、及び記録マークは、参加左フラグまたは右の組み合わせ値(値)。減らすシャッフルステージ、関連する鍵は、一次ソートキーの組み合わせに応じて関連するキーは、次いで、二次ソートフラグに応じて、同じである場合。仕切部において、唯一のセクションに関連付けキーに関連するキーと、同一のレコードが同じキーに関連されるように確保しつつ、値リスト記録テーブルが左に参加値リストの前部、及び参加の右のテーブル記録値リストの後ろに。

例えば、AがB ON(A.id = b.id参加 )を仮定すると、表Aおよび表Bが有する記録ID = 3を、次いで、このレコードは、表Aにキーの組み合わせでの(3,0)、表Bはレコードのキーの組み合わせである(3,1)。並べ替えを保証することができますテーブルAのレコードを、以前に表Bに記録 しながら治療を減らす際、ID = 3と同じで値のリスト形式  、値リスト= [A =表3のキーID = 3が記録される表Bに、ID = 3、レコード]

次は二つのテーブルが関連付けないときを見て何が行われたかを減らします。処理する一緒に減らし、すべてが同じIDを記録します。私たちは、リストは配列で表現された値。

1)最初のレコードの読み取りに減らし、V [0]、場合ことを見出したV [0]は、表Bに記録され、それが存在しないことを意味し、テーブルAのレコードが、最終的な出力は、プロセスの続行するように必要関連付けられないことはありません、IDおよび読んで、V [0]を1つの読取動作。

それが発見された場合2)のV [0]〜V [長-1]が全てされ、表Aに記録され、それは存在しないことを意味し、表Bのレコード、同じ最終出力に関連付けられていない、既にことに留意され行っ価値読み取り長回取得操作。

3)例えば、テーブルID = 3を持つレコードを、BテーブルIDが3ある= 10件のレコードが。最初の読み出しのV [0]に見出されると、表Aに記録された二次読み出し動作。次に読み出しV [1]ことが判明した操作テーブルB、次に[0]及びV V [1]と直接統合され、出力に関連させることができる第2の操作。この時間は知っている既に減らすVを[1]後に開始されるBテーブルを記録し、それを直接することができる[0]を順次V、およびV [2]、V [3 ] ... V [10] とは関連動作を出力します、の合計11回の操作。

4)と仮定すると、切り替えるテーブルIDを= 3である10のレコード、B表ID = 3を有するレコードが。最初の読み出しのV [0]に見出されると、表Aに記録された二次読み出し動作。その後、読み出しV [1]ままにすることが見出されているの合計で、表Aに記録された2回の読み出し動作。だから、読み出しV [9]見つかった場合、または合計で、記録シートA の10倍の読み出し動作。最後読み取る1記録すなわち、V [10]が見つかり、表Bに記録することができるV [0]、V [10]合計出力を関連付ける11回の操作。直接次のV [1]〜V [9 ] のそれぞれの合計と、出力V [10]を関連付ける20回の操作。

5)もう少し複雑な仮定テーブルID = 3が存在する二つのレコードは、BテーブルID = 3である5つのレコードが。最初の読み出しのV [0]に見出されると、表Aに記録された二次読み出し動作。その後、読み出しV [1]ままにすることが見出されているの合計で、表Aに記録された2回の読み出し動作。次に読み出しV [2]が発見され、その後、表Bに記録された[0]及びV V [2]直接の合計と、出力に関連付けることができる3つの動作。次のV [0]に順次であってもよく、V [3]〜V [6 ] の合計に関連する出力のための7つの操作。次に、V [1]の順番で、及びV [2]〜V [6 ] の合計に関連する出力のための12回の操作。

6)実施例5と仮定すると、上で転送されるテーブルID = 3ある5つのレコードは、BテーブルID = 3が存在する二つのレコードが。最初の読み取りV [0]見出されると、表Aに記録された二次読み出し動作。その後、読み出しV [1]ままにすることが見出されているの合計で、表Aに記録された2回の読み出し動作。だから、読み出しV [4]はそれがまだ見つかったの合計で、表Aに記録された5回の読み出し動作。次に読み出しV [5]、発見され、その後、表Bに記録された[0]及びV V [5]直接の合計と、出力と関連付けることができる6つの操作。そしてV [0]との合計に関連する出力用V [6]、7つの操作。次いで、V [1]は、それぞれ、及びVの[5]、Vの合計出力、関連付けられた[6] 9つの操作。V [2]は、それぞれ、およびV [5]、合計で、出力に関連付けられたV [6] 11の操作。そしてように、そして最終的にV [4]は、夫々 、及びVの[5]、合計で、出力に関連付けられたV [6] 15の操作。

7)追加の言及、場合検出減らす記録表Aの時間も記録されていると、表Aにキーのレコードの数、同じ発見されたキー以外のレコードの数値hive.skewjoin.key(デフォルト1,000,000時間)は、なり減らすログをプリントアウトキー、および傾斜ラベルに関連するキーを押します。

最終的な結論である:すべてのための関連するテーブルの左側に書かれた1底条重複アソシエーションのキーはよりなり、二次演算処理。

想定表は千万持っているIDを、平均idが持っている3つの、重複する値は、書いた前にこの時間を書いた演算処理時間3000万を行うために行います、それの前の相関テーブルを、パフォーマンスが来た後の違いを参照してください。

おすすめ

転載: www.cnblogs.com/bgh408/p/11646286.html