List Spark/Scala-使用带有列表[(Int,Double]的RDD的keyBy
我面临着一个问题,我不知道如何以优雅的方式解决。我有两个RDD需要加入:List Spark/Scala-使用带有列表[(Int,Double]的RDD的keyBy,list,scala,join,apache-spark,rdd,List,Scala,Join,Apache Spark,Rdd,我面临着一个问题,我不知道如何以优雅的方式解决。我有两个RDD需要加入: First - RDD[(Int, Double)] Second - RDD[MyObject, List[(Int, Double)]) 我需要使用Int作为键加入这两个RDD。对于第一个RDD,很清楚-我可以使用Int定义keyBy,但是如何在第二个RDD中定义keyBy?我的结果RDD必须具有以下结构 RDD[MyObject,Int,Double]其中Double是上面两个Double被Int键连接后相乘的结果
First - RDD[(Int, Double)]
Second - RDD[MyObject, List[(Int, Double)])
我需要使用Int
作为键加入这两个RDD。对于第一个RDD,很清楚-我可以使用Int
定义keyBy
,但是如何在第二个RDD中定义keyBy
?我的结果RDD必须具有以下结构
RDD[MyObject,Int,Double]
其中Double
是上面两个Double
被Int键连接后相乘的结果。
我知道我可以通过使用两个嵌套循环来解决这个问题。我正在寻找一个更优雅的解决方案。使用flatMap
:
val first: RDD[(Int, Double)] = // ...
val second: RDD[T, List[(Int, Double)]) = // ...
val flattened: RDD[(Int, (T, Double))] = second.flatMap { case (t, list) =>
list.map { case (i, d) => (i, (t, d)) }
}
val joined: RDD[(Int, (Double, (T, Double)))] = first.join(flattened)
val multiplied: RDD[(T, Int, Double)] = joined.map { case (i, (d1, (t, d2))) =>
(t, i, d1 * d2)
}