repartition()不影响RDD分区大小

时间:2015-07-20 03:13:30

标签: apache-spark rdd

我正在尝试使用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

正如人们所看到的,它并没有改变。有人能解答原因吗?

1 个答案:

答案 0 :(得分:15)

首先,因为repartition确实很懒,所以你运行一个动作很重要。其次,repartition会返回一个新的RDD并更改分区,因此您必须使用返回的RDD,否则您仍在处理旧分区。最后,缩小分区时,应使用coalesce,因为这不会重新洗牌。它将保留关于节点数量的数据并拉入剩余的孤儿。

相关问题