2015-07-20 62 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

這更多的是措辭的技術性。數據被移動,但沒有洗牌,這是一個隨機洗牌通常是最重要的性能密集型。此外,如果這解決了您的問題,請不要忘記將其標記爲答案:) –