2017-04-07 9 views
0

私たちは50MM行を処理するSpark環境を持っています。これらの行にはキー列が含まれています。一意のキー数は2000に近いです。これらの2000のキーをすべて並列に処理したいと思います。したがって、次のようなSpark SQLを使用しています。スパークパーティション - DISTRIBUTE BYオプションを使用

hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY") 

次に、すべてのパーティションでうまく動作するmapPartitionsを並列に使用します。しかし、問題は、デフォルトでは200個のパーティションしか作成しないということです。次のようなコマンドを使用して、私はユニークなキーの数が何であるかを知ることはできません実際の製造運転中にパーティションが

hiveContext.sql("set spark.sql.shuffle.partitions=500"); 

を増加させることができています。私はこれを自動管理したい。これを行う方法はありますか?

おかげ

バラ

答えて

1

私はあなたが「配分」機能を使用して、新しい一時テーブルとして再パーティションとさらにキャッシュそれより高速な処理のために登録することを示唆しています。さらにクエリの

val distinctValues = hiveContext.sql("select KEY from BigTbl").distinct().count() // find count distinct values 

hiveContext.sql("select * from BigTbl DISTRIBUTE by KEY") 
     .repartition(distinctValues.toInt) // repartition to number of distinct values 
     .registerTempTable("NewBigTbl") // register the repartitioned table as another temp table 

hiveContext.cacheTable("NewBigTbl") // cache the repartitioned table for improving query performance 

迅速な対応のための "NewBigTbl"

+0

は本当にありがとうございましたを使用します。私は別の機能のテストを終了しています。私がそれを済ませたら、あなたが提案して更新しているアプローチを確かに試みるでしょう。助けをもう一度ありがとう –

+0

ありがとう@Snchitグローバー。それは非常にうまくいった。ありがとうございました。しかし、私はパーティションの数が多いために別の問題にぶつかります。私たちはSpark 1.6.1で作業しており、私たちはバグSPARK-12837を打っていると思います。 2.0にアップグレードできるかどうか試してみる。今のところこの問題は解決され、もう一度感謝しています。 –

関連する問題