我在群集上有一个RDD分区,我想分别在每个分区上执行reduceByKey
。我不希望将分区上的reduceByKey结果合并在一起。我想阻止Spark在集群中执行reduceByKey的shuffle中间结果。
以下代码不起作用,但我想要这样:
myPairedRDD.mapPartitions({iter => iter.reduceByKey((x, y) => x + y)})
我怎样才能做到这一点?
答案 0 :(得分:1)
你可以尝试一下
myPairedRDD.mapPartitions(iter =>
iter.groupBy(_._1).mapValues(_.map(_._2).reduce(_ + _)).iterator
)
或为了提高内存效率(此处我假设myPairedRDD
为RDD[(String, Double)]
。请根据您的使用情况调整类型):
myPairedRDD.mapPartitions(iter =>
iter.foldLeft(mutable.Map[String, Double]().withDefaultValue(0.0)){
case (acc, (k, v)) => {acc(k) += v; acc}
}.iterator
)
但请注意,与改组操作不同,它无法从内存中卸载数据。