如何从 Pair Rdd 中的所有键中减去值?

How to substract values from all keys in Pair Rdd?

我有一个 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(_+_).

可以试试自己rdd的cartesian产品,然后groupbyKey。

例如

val rdd=sc.parallelize(1 to 10)
rdd.cartesian(rdd).groupByKey().map(.......subtract here....)