2016-12-29 49 views
1

我們有兩個數據幀df1df2並且正在對df2執行轉換。在df2完成所有轉換之後,我們需要在df2中追加df1。爲此,我們使用unionAll函數。DAG調度程序在使用unionALL時重複處理階段

val v_asciiFileWithHeader = v_header.unionAll(vr_dataframeAsciiFile) 

unionAll後,當我們打印了它的DAG,其重複所有的處理階段又由於其所有的處理完成兩次當一個動作被調用。

如果我們在應用unionAll之前堅持df2,那麼所有的處理階段都不會重複。

作爲參考,已附着在DAG爲數據幀unionAll前,後UnionAll(without persisting df2),後unionAll(with persisting df2)

當上是非持久的數據幀被施加unionAll重複那麼,爲什麼處理階段。

火花版本 - 1.6.1 斯卡拉版 - 2.10.6

Print Schema for each dataframe

+0

處理部分'df2'是否包含任何操作或僅包含轉換? – code

+0

@code之前它只有轉換。但爲了堅持,我們添加了一個動作,即df2.count –

+0

此前還有df2轉換被執行了兩次? – code

回答

2

星火DAG調度的第一組變換分爲一個階段,工會操作的另一個舞臺。此外,DAG調度表決定這兩個階段可以並行運行,因爲它們不依賴於彼此,而是依賴於共同父項。

因此,當它並行運行兩個階段時,同一組轉換將同時運行。

避免這種情況的解決方案是顯示這兩個階段是相互依賴的,不應該並行運行。所以,當你調用一個動作並在聯合操作之前堅持Dataframe時,stage-1將首先被執行,因爲它在它的結尾有一個動作。一旦這個階段完成,階段2(即工會行動)就會執行。

此時,聯合所需的數據幀已經被第1階段計算並保存,因此它將按原樣使用,而不是重新計算它

希望這可以澄清你的疑問。

+0

即使我們對df2應用了轉換,我也無法得到這個結果,同樣的轉換應用於df1.unionAll(df2) –

+0

的輸出。是的,這是因爲DAG調度在一個階段執行轉換(stage-1 )和另一階段的工會運作(階段2)。現在,DAG調度程序檢查是否計算了階段2中涉及的數據幀。由於兩個階段並行運行,數據幀尚未計算。因此,它會在階段2中再次計算stage-1中計算的數據幀。 – code

相關問題