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

时间:2018-09-19 22:40:57

标签: scala apache-spark rdd key-value

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

1 个答案:

答案 0 :(得分:0)

您可以试用self rdd的cartesian乘积,然后尝试groupbyKey。

例如

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