2015-07-20 51 views
4

我试图使用重新分区()方法更改RDD的分区大小。在RDD的方法调用成功,但是当我明确检查使用RDD的partition.size财产的分区大小,我回来了相同数目的分区,它原本有: -重新分区()不影响RDD分区大小

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 

正如人们所看到的,它没有改变。有人可以回答原因吗?

回答

11

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

+0

谢谢,明白了。但是,当使用合并来缩小分区时,我们怎么能说重新洗牌不会发生?因为当我们缩小分区时,删除的分区上的数据必须放在剩余分区的某个地方,这不是重新洗牌吗?或者那正是你所说的“拉进剩下的孤儿”? – Dhiraj

+0

这更多的是措辞的技术性。数据被移动,但没有洗牌,这是一个随机洗牌通常是最重要的性能密集型。此外,如果这解决了您的问题,请不要忘记将其标记为答案:) –