2017-10-25 10 views
1

たとえば 私は多くの計算を行っています と私はついに にデータフレーム3つをダウンしています。例えば2つのデータフレームをスカラで並列に書き込む

val mainQ = spark.sql("select * from employee") 
mainQ.createOrReplaceTempView("mainQ") 
val mainQ1 = spark.sql("select state,count(1) from mainQ group by state") 
val mainQ2 = spark.sql("select dept_id,sum(salary) from mainQ group by dept_id") 
val mainQ3 = spark.sql("select dept_id,state , sum(salary) from mainQ  group by dept_id,state") 
//Basically I want to write below writes in parallel. I could put into 
//Different files. But that is not what I am looking at. Once all   computation is done. I want to write the data in parallel. 
mainQ1.write.mode("overwrite").save("/user/h/mainQ1.txt") 
mainQ2.write.mode("overwrite").save("/user/h/mainQ2.txt") 
mainQ3.write.mode("overwrite").save("/user/h/mainQ3.txt") 
+0

あなたがスパーククラスタを持っているとき、データフレームはすでに並列に動作しています。今でも2つのデータフレームを一緒に使用したい場合は、スレッドコンセプトを実装することをお勧めします。 –

答えて

0

は通常、ドライバコードでマルチスレッドを使用しない利点がない、時にはそれは、パフォーマンスを向上させることができます。私は、並列スパークジョブを起動するとパフォーマンスが大幅に向上した、つまり個々のジョブがクラスタリソースをうまく利用していない(データスキューやパーティションが少なすぎるなど)状況がありました。あなたのケースでは、あなたが行うことができます:

ParSeq(
    (mainQ1,"/user/h/mainQ1.txt"), 
    (mainQ2,"/user/h/mainQ2.txt"), 
    (mainQ3,"/user/h/mainQ3.txt") 
).foreach{case (df,filename) => 
    df.write.mode("overwrite").save(filename) 
} 
+0

私は何らかのfor文を考えました - 次の(2回目の)反復に行きます。 1回目の反復を行う必要があります。その意味ではまだシーケンシャルモードで動作していないでしょうか?私はそれを試してみましょう。 – user3539924

+0

私はテストして、それらがすべて同時に起動されているのを見ることができました。しかし、それは連続的ではなく時間がかかりました。スパークがより多くの記憶を必要とするかもしれないという事実のためかもしれませんか?したがって、私の場合は、並列実行と並列実行では少し遅くなりました – user3539924

関連する問題