我正在尝试使用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
正如人们所看到的,它并没有改变。有人能解答原因吗?
答案 0 :(得分:15)
首先,因为repartition
确实很懒,所以你运行一个动作很重要。其次,repartition
会返回一个新的RDD
并更改分区,因此您必须使用返回的RDD
,否则您仍在处理旧分区。最后,缩小分区时,应使用coalesce
,因为这不会重新洗牌。它将保留关于节点数量的数据并拉入剩余的孤儿。