2016-03-26 15 views
-1

私は2つのRDDをKey-Valueタイプにしました。 RDD1[K,V],RDD2[K,U]である。 RDD1RDD2の両方のKのセットは同じです。2元のRDDから新しいRDDを計算

地図からRDD[K, (U-V)/(U+v)]が必要です。 私の方法は、まずに続いてマップ新しいRDD

val newRDD = RDD1. RDD2.join(RDD2) 

RDD1に参加しています。

newRDD.map(line=> (line._1, (line._2._1-line._2._2)/(line._2._1+line._2._2))) 

ことがRDD1(RDD2)に設定されている問題は終わっ億を持っているので、 2間のセットに参加するには、実行するための非常に高価なコストだけでなく、長い時間(3分)を取ります。

このタスクの時間を短縮する方法はありますか?

+0

現在の設定は何ですか?データを分割しますか?いくつのコア/エグゼキュータ/ RAMがありますか?私はあなたが5秒後に結果を得るとは言わないが、最終的には仕事が終わるのを待たなければならない:) – Markon

+0

またあなたの現在のコードを投稿してあなたの質問を更新できますか? (スタックオーバーフローは、コードブロックを強調表示して読みやすくするために使用できる「コード」タグを提供します) – Markon

答えて

0

は最初DataFrameに変換してみてください。

脇はるかに高速であることから
val df1 = RDD1.toDF("v_key", "v") 
val df2 = RDD2.toDF("u_key", "u") 

val newDf = df1.join(df2, $"v_key" === $"u_key") 
newDF.select($"v_key", ($"u" - $"v")/($"u" + $"v")).rdd 

(スパークがあなたのために最適化を行いますので)私はそれがより良い読みだと思います。

また、私の場合は、最後に.rddを実行しません。私はDataFrameのままにしておきます。しかし、それは私です。

関連する問題