ハイブ重複排除統計
人々は通常、データの量が非常に大きなテーブルには、あなたが簡単な見つけるときハイブの使用は、多くの場合、再カウント等にそれを使用しますが、それはパフォーマンス上の問題のデエンファシスについて稀に懸念ようだが、と信じているcount(distinct order_no)
ようにします声明は、特に遅い実行している、との直接ランニングcount(order_no)
悪化し、多くの時間を、これほど少ないのを研究しています。
私は結論をお話しましょう:使用することができますgroup by
代わりにdistinc
使用していないdistinct
例を:
実証
レコードの順序763 191 489の合計数のorder_snapスナップショットテーブル-約800万レコード、合計サイズ:108.877ギガバイト、ストレージは、注文番号が繰り返さされていない約20のフィールド、すべての注文情報テーブルでありますその再体重までの時間の統計的な数の注文数の合計が結果は同じではありません、私たちは見てみましょう:
統計は、すべての注文はどのように多くの道路、数えるcount
あなたは、SQLのパフォーマンスを得ることができる方法の機能を。
- DISTINCT
1
2
3
4
5
6
7
|
order_snapからのカウント(個別のORDER_NO)を選択します。
ステージステージ1:地図:
396が削減: 1累積CPU:7915.67秒HDFS読む: 119072894175 HDFS書き込み: 10 SUCCESS
合計MapReduceのCPUプレイ時間:
0日 2時間 11分 55秒 670ミリ秒
OK
_c0
763191489
時間がとら:1818.864秒、フェッチされた:
1行(複数可)
|
- GROUP BY
1
2
3
4
5
6
7
8
|
SELECT COUNT(t.order_no)から(ORDER_NOによってorder_snap群から選択ORDER_NO)T。
ステージステージ1:地図:
396が削減: 457累積CPU:10056.7秒HDFS読む: 119074266583 HDFS書き込み: 53469 SUCCESS
ステージステージ-2:地図:
177が削減: 1累積CPU:280.22秒HDFS読む: 472596 HDFS書き込み: 10 SUCCESS
合計MapReduceのCPUプレイ時間:
0日 2時間 52分 16秒 920ミリ秒
OK
_c0
763191489
時間がとら:244.192秒、フェッチされた:
1行(複数可)
|
結論:第二の性能の文言は、最初のある7.448499541
時間は
Hadoopのは、実際に大規模なデータ、ハイブデータを処理し、データは、我々は両方の出力を見て、スキューことを恐れて、あまりを恐れていないが、この差がある理由に気づきました情報:
1
2
3
4
|
#明確な
ステージステージ1:地図:
396が削減: 1累積CPU:7915.67秒HDFS読む: 119072894175 HDFS書き込み: 10 SUCCESS
#グループによる
ステージステージ1:地図:
396が削減: 457累積CPU:10056.7秒HDFS読む: 119074266583 HDFS書き込み: 53469 SUCCESS
|
病気の感染が発見されていない、明確なORDER_NOの使用はすべてそれを下げることができない、我々はデータスキュー呼んで減速、内側にシャッフルする必要が減速などの性能に傾斜しているのだろうか?457から、第2の直接次のグループ番号を見てreducer
、データは。コースの複数のマシン実行、高速時に配布され
ないマニュアルがないので、指定された数を減らし、ハイブはに従って動的データのサイズを指定サイズを減らし、あなたはまた、マニュアルを指定することができます
1
|
ハイブ>設定mapred
.reduce .tasks = 100。
|
このように、データの量が多い場合に特にので、使用しないようにしてくださいdistinct
、それを。
しかし、あなたはレコードの合計数とデエンファシス後のレコードの数の計算書を見て、フィルタリングする方法がないことを、次の2つの選択肢を持っているので、いずれか2つのSQL文を使用したい場合に実行され、その後、労働組合は、すべてあるいは単なる異なりました。具体的には、特定の状況に依存し、そのデータの量が推奨されていない場合は、データが大きすぎる場合は、直接使用良い可読性が明確な、、、パフォーマンスが影響を受け、その後、最適化を検討しています