从2个原始RDD计算新的RDD

时间:2016-03-26 09:35:56

标签: apache-spark

我有2个键值类型的RDD。 RDD1[K,V]RDD2[K,U]RDD1RDD2的K集合相同。

我需要使用RDD地图添加到新的[K, (U-V)/(U+v)]。 我的方法首先是加入 RDD1

val newRDD = RDD1. RDD2.join(RDD2)

然后映射新的RDD。

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

问题是set RDD1( RDD2)超过1亿,因此2套之间的 join 需要花费非常昂贵的成本以及执行的长时间(3分钟)。 / p>

有没有更好的方法来减少这项任务的时间?

1 个答案:

答案 0 :(得分: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 

除了快得多(因为Spark会为你做优化),我觉得它看起来更好。

我还应该注意,如果是我,我不会在最后做.rdd - 我会留下DataFrame。但那就是我。