repartition() 不影响 RDD 分区大小

repartition() is not affecting RDD partition size

我正在尝试使用 repartition() 方法更改 RDD 的分区大小。 RDD 上的方法调用成功,但是当我使用 RDD 的 partition.size 属性 显式检查分区大小时,我得到的分区数与它原来的分区数相同:-

scala> rdd.partitions.size
res56: Int = 50

scala> rdd.repartition(10)
res57: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[19] at repartition at <console>:27

在这个阶段,我会执行一些像 rdd.take(1) 这样的操作来强制评估,以防万一。然后我再次检查分区大小:-

scala> rdd.partitions.size
res58: Int = 50

如你所见,它没有改变。有人可以回答为什么吗?

首先,运行 一个动作确实很重要,因为 repartition 确实是懒惰的。其次,repartition returns 一个新的 RDD 改变了分区,所以你必须使用返回的 RDD 否则你仍然在使用旧的分区。最后,在缩小分区时,您应该使用 coalesce,因为那样不会重新排列数据。相反,它将保留有关节点数量的数据并拉入剩余的孤儿。