Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Spark/Scala-使用带有列表[(Int,Double]的RDD的keyBy_List_Scala_Join_Apache Spark_Rdd - Fatal编程技术网

List Spark/Scala-使用带有列表[(Int,Double]的RDD的keyBy

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键连接后相乘的结果

我面临着一个问题,我不知道如何以优雅的方式解决。我有两个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键连接后相乘的结果。

我知道我可以通过使用两个嵌套循环来解决这个问题。我正在寻找一个更优雅的解决方案。

使用
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)
}