2016-12-29 46 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

相关问题