【问题标题】:How to substract values from all keys in Pair Rdd?如何从 Pair Rdd 中的所有键中减去值?
【发布时间】:2018-09-19 22:40:56
【问题描述】:

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

【问题讨论】:

    标签: scala apache-spark rdd key-value


    【解决方案1】:

    你可以试试self rdd的cartesian乘积然后groupbyKey。

    例如

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

    【讨论】:

    • 我可以为每个 id 与除自身之外的所有其他人做笛卡尔吗?例如,在 id 1 中,仅使用 2 和 3 进行笛卡尔运算。
    • 不,那是不可能的。您可以在地图操作中排除自我 ID,例如第二行。
    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2019-09-09
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多