我有2个键值类型的RDD。 RDD1
为[K,V]
,RDD2
为[K,U]
。
RDD1
和RDD2
的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>
有没有更好的方法来减少这项任务的时间?
答案 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
。但那就是我。