我有一个Pair Rdd[(Int, Array[Double])]
,我希望每个键都从其自身中减去所有其他数组。
例如,如果我的rdd
是:
[(1, Array_1[Double])]
[(2, Array_2[Double])]
[(3, Array_3[Double])]
我想要:
[(1, Sum( Array_1[Double] - Array_i[Double] ))], where i=2,3
[(2, Sum( Array_2[Double] - Array_i[Double] ))], where i=1,3
[(3, Sum( Array_3[Double] - Array_i[Double] ))], where i=1,2
我曾考虑过将rdd
转换为Rdd[(Int, (Array, List(Array)))]
,但我不知道还有什么比这更容易的事情。
有解决方案的想法吗?
答案是:
val S = rdd.cartesian(rdd).filter{ case(a, b) => a._1!=b._1}
.map(x => (x._1._1, (x._1._2-x._2._2)))
.reduceByKey(_+_).
答案 0 :(得分:0)
您可以试用self rdd的cartesian乘积,然后尝试groupbyKey。
例如
val rdd=sc.parallelize(1 to 10)
rdd.cartesian(rdd).groupByKey().map(.......subtract here....)