2015-11-22 123 views
0

我有個問題,當RDD存儲在內存中時。 可以說,我有這樣的代碼:Spark中的RDD持久性

val dataset = originalDataset 
    .flatMap(data => modifyDatasetFormat(data, mappingsInMap)) 
    .persist(StorageLevel.MEMORY_AND_DISK)  

到目前爲止,我有存儲在每個工作節點的內存RDD

問題: 如果我對這個RDD做了另一個轉換或操作,這個持久性會停止嗎?我應該創建另一個,還是與它沒有任何關係?

如果我在這個RDD(e.x散列分區)中更改分區,這個持久性會停止存在,我應該創建另一個分區或者它沒有任何關係?

感謝

回答

2

,如果我做另一變換或行動來此RDD,將在持久性停止存在

如果我在這個RDD更改分區(例如散列分區),這種持久性會不會存在

編號

轉換(包括重新分區)不能改變現有的RDD,特別是它們不能不執行它。當然

  1. 轉換的結果本身不會被持續;

  2. (正如Jem Tucker的評論中指出的那樣)您需要轉換持續的RDD,而不是您調用persist的那個RDD。 I.e.

    val dataset1 = originalDataset. 
        flatMap(data => modifyDatasetFormat(data, mappingsInMap)) 
    dataset1.persist(StorageLevel.MEMORY_AND_DISK) 
    val dataset3 = dataset1.map(...) 
    

    將重新計算dataset1。相反,你需要

    val dataset2 = dataset1.persist(StorageLevel.MEMORY_AND_DISK) 
    val dataset3 = dataset2.map(...) 
    
+0

所以換句話說....爲創建我必須堅持它,並unpersist老one.Is是正確的每一個新的RDD? – Nick

+0

我相信你的第2點是不正確的,當你調用rdd時,返回值是'this'引用,所以你的兩個例子實際上都是相同的。 –

+0

可以說你有這個:val dataset2 = dataset1.persist(StorageLevel.MEMORY_AND_DISK) val dataset3 = dataset2.foreach(...)。如果您對數據集2進行了轉換,則必須將其保留並將其傳遞給數據集3。我對麼? – Nick