2016-04-15 8 views
0

ハイブunion allを使用して1つのファイルに複数のファイルが結合されていますが、union allクエリは10個を超えるHiveテーブルを結合し、非常に遅くなりました。各個別のunion allクエリには、1つ以上の結合条件もあります。ハイブパフォーマンスユニオンall

私の予想最終結果は、例えば、主キーによってグループ化する必要がある:

table 1 

key1|val1|val2|.. 

table 2 

key1|val10|val11|.. 

insert overwrite <temptable> 
select key, output_string from 
(select key, concat (col1,col2,..) from table 1 where <join conditions> 
union all 
select key, concat(col10,col11,..) from table 2 where <join conditions> 
.. 
) 
cluster by key; 

union allは、所望の結果を得るために重要なことで、私はクラスタを使用している二つのテーブルの上に結合します。ハイブのパフォーマンスは非常に遅いですが、他の選択肢は何ですか?

+0

私は@ veeraBの回答を参照してください。最初の質問は、個々のクエリのそれぞれがどれくらい時間を取っているかということです。長時間実行されているものはすべて、 'union'チェーンに影響します。次の質問は、Hiveがそれぞれのクエリを並列に実行するような方法でクエリを解析できるかどうかです。これは、おそらく 'EXPLAIN'によって観察されるか、または実行時に見ているだけです。もしそうでなければ、 'hive.optimize.union.remove'設定を考慮するオプションかもしれません。 –

答えて

0

注このオプション:

hive.optimize.union.remove 
Default Value: false 
Added In: Hive 0.10.0 with HIVE-3276 

組合を削除して、労働組合と組合上記のファイルシンクの間の演算子をプッシュするかどうか。これにより、ユニオンによる出力の余分なスキャンが回避されます。

これは、ユニオンクエリに個別に役立ちます。特に、hive.optimize.skewjoin.compiletimetrueに設定されている場合は、余分な共用体が挿入されるため便利です。

hive.merge.mapfilesまたはhive.merge.mapredfilesのいずれかがtrueに設定されている場合、マージがトリガーされます。

ユーザーがfalsetruehive.merge.mapredfileshive.merge.mapfilesを設定している場合は、アイデアは、レデューサーの数が少ないので、ファイルの数がとにかく小さいということでした。

しかし、この最適化では、ファイルの数を大幅に増やしています。だから積極的にマージする。

+0

おかげでTomとveeraB。 hive.optimize.skewjoin.compiletimeはこのトリックを行うべきです。すべてのクエリの組合では、以前は100以上のマップ削減ジョブが生成されていましたが、不要な結合の一部を削除するために変更を加えましたが、現在は12以上の仕事があります。 – rupal