假設我有一些RDD有血統是這樣的:在動作之前UNION父rdd和子rdd會發生什麼?
rdd0 - > RDD1集 - > RDD2 - > rdd3 - > rdd4
發生什麼事,當我做rdd1.union(RDD2).union(rdd3)。工會(rdd4).collect()?在計算rdd4時,spark會做rdd0到rdd3轉換的重新計算嗎?
假設我有一些RDD有血統是這樣的:在動作之前UNION父rdd和子rdd會發生什麼?
rdd0 - > RDD1集 - > RDD2 - > rdd3 - > rdd4
發生什麼事,當我做rdd1.union(RDD2).union(rdd3)。工會(rdd4).collect()?在計算rdd4時,spark會做rdd0到rdd3轉換的重新計算嗎?
union
是一個轉換,所以當你做val x = a union(b)
時,它會在標識符x
所指的血統中添加一個新元素。目前沒有什麼是真正計算的。把它想象成一個藍圖,添加元素。當在x
上調用動作時,將執行該藍色打印,從添加的第一個元素開始。現在
,你的情況,當你做rdd1.union(rdd2).union(rdd3).union(rdd4).collect()
,你基本上都添加了3元到您的藍圖(的rdd1
和rdd2
的結果,工會的rdd3
與先前結果與先前結果的rdd4
工會)。現在,藍圖最終從最初執行collect()
時開始執行。
如果您在很多操作中使用rdd1
,最好緩存/保留它,否則它將重新計算。
讓我知道這是否有幫助,乾杯。
當你調用聯合時,spark會得到一個新的RDD.This RDD有成員ro保留它的父親來計算它的依賴。依賴性用於生成DAG。 DAG用於在調用操作時生成階段。
謝謝!我知道工會只有在打電話時纔會執行。其實我擔心的是,如果有必要緩存我的rdd1或不。你的意思是在執行動作時它會計算出(rdd0 - > rdd1)+(rdd0 - > rdd1 - > rdd2)+(rdd0 - > rdd1 - > rdd2 - > rdd3)+ .....或者它可以自動優化爲(rdd0 - > rdd1)+(rdd1 - > rdd2)+(rdd2 - > rdd3)+ ..? –
是的,在這種情況下,您將需要緩存數據。所以,如果你使用rdd1進行很多操作,最好是緩存/保存它,否則它會重新計算 –