在分区数据上运行groupByKey/ reduceByKey,但使用不同的键

3

我有一个类型为((id, ts), some value)的有序RDD。这使用了一个自定义分区器,仅在id字段上进行分区。

math.abs(id.hashCode % numPartitions)

现在,如果我在这个分区的RDD上运行以下两个函数,它会涉及到数据集的洗牌和重新分区吗?
val partitionedRDD: ((id:Long, ts:Long), val:String) = <Some Function>
val flatRDD = orderedRDD.map(_ => (_._1.id, (_._1.ts, _._2)))

我想知道的是,flatRDD.groupByKey()flatRDD.reduceByKey()是否会具有与partitionedRDD相同的分区方式,还是Spark会再次洗牌数据集并创建新的分区?
谢谢, Devi
1个回答

3

是的,在flatRDD上执行groupByKeyreduceByKey操作必然会引起另一次洗牌。

由于您知道您的flatRDD已经通过id进行了分区,因此您可以安全地假设所有具有相同id的记录都位于一个单独的分区内。因此,如果您想要groupBy(id),您可以使用mapPartitions(带有preservesPartitioning = true)并对每个分区单独执行该操作,从而防止Spark对数据进行洗牌:

flatRDD.mapPartitions({ it =>
  it.toList
    .groupBy(_._1).mapValues(_.size) // some grouping + reducing the result
    .iterator

}, preservesPartitioning = true)

这不会导致额外的洗牌:

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接