2017-08-10 47 views
1

許多教程提到RDD的預分區將優化火花作業的數據混排。我很困惑的是,因爲我的理解,預分區也會導致洗牌,爲什麼在這裏提前洗牌會有利於某些操作?特別是它會自我激發,會爲一組轉換做優化。爲什麼預分區會因減少混洗而受益?

例如:

如果我想將兩個數據集的國家(ID,國家)和收入(ID,(收入,月,年)),這是什麼兩種操作之間的區別? (我用PySpark模式)

  1. 通過ID預分區

    country = country.partitionBy(10).persist() 
    income = income.partitionBy(10).persist() 
    income.join(country) 
    
  2. 直接加入無預分區:

    income.join(country) 
    

如果我只需要計算這個加入一次,在加入之前使用預分區仍然有用嗎?我認爲partitionBy也需要洗牌吧?如果我加入後的進一步計算都是以使用國家爲關鍵(以前用於加入的關鍵字ID將無效並從RDD中刪除),那麼我應該如何優化計算?

回答

1

如果我只需要計算一次這個連接,在連接之前使用預分區仍然有用嗎?我認爲partitionBy也需要洗牌嗎?

你是完全正確的。僅當分區數據將被重複用於多個DAG路徑時,搶先分區纔有意義。如果你只有join只在一個不同的地方洗牌。

0

parititionBy確實不是洗牌數據,如果這就是你要求的。

通過預先申請partitionBy您不會避免洗牌。你只是把它推到另一個地方。如果分區RDD重複使用多次,這可能是一個好主意,但是對於一次性連接,您沒有任何收穫。

相關問題