分别对RDD的每个分区执行reduceByKey而不聚合结果

时间:2018-05-11 11:20:50

标签: scala apache-spark rdd

我在群集上有一个RDD分区,我想分别在每个分区上执行reduceByKey。我不希望将分区上的reduceByKey结果合并在一起。我想阻止Spark在集群中执行reduceByKey的shuffle中间结果。

以下代码不起作用,但我想要这样:

myPairedRDD.mapPartitions({iter => iter.reduceByKey((x, y) => x + y)})

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

你可以尝试一下

myPairedRDD.mapPartitions(iter => 
  iter.groupBy(_._1).mapValues(_.map(_._2).reduce(_ + _)).iterator
)

或为了提高内存效率(此处我假设myPairedRDDRDD[(String, Double)]。请根据您的使用情况调整类型):

myPairedRDD.mapPartitions(iter => 
  iter.foldLeft(mutable.Map[String, Double]().withDefaultValue(0.0)){ 
    case  (acc, (k, v)) => {acc(k) += v; acc}
  }.iterator
)

但请注意,与改组操作不同,它无法从内存中卸载数据。