DAG调度程序在使用unionALL时重复处理阶段

时间:2016-12-29 11:54:18

标签: scala apache-spark apache-spark-sql spark-dataframe

我们有两个数据帧df1df2,并且正在对df2执行转换。在df2上完成所有转换后,我们需要在df2中附加df1。为此,我们使用unionAll函数。

val v_asciiFileWithHeader = v_header.unionAll(vr_dataframeAsciiFile)

但在unionAll之后,当我们打印其DAG时,它会再次重复所有处理阶段,因为在调用操作时所有处理都会完成两次。

如果我们在应用unionAll之前持久化df2,则不会重复所有处理阶段。

作为参考,在unionAll之后UnionAll(without persisting df2)之后unionAll(with persisting df2)

之后附加了数据帧的DAG

那么,为什么在unionAll应用于未加载的数据帧时,处理阶段会重复。

Spark-version - 1.6.1 Scala版本 - 2.10.6

Print Schema for each dataframe

1 个答案:

答案 0 :(得分:2)

Spark DAG调度程序将您的第一组转换分为一个阶段,将union操作分隔为另一个阶段。此外,DAG计划决定这两个阶段可以并行运行,因为它们不是相互依赖,而是相互依赖。

因此,当它并行运行两个阶段时,同一组转换将同时运行。

避免这种情况的解决方案是显示这两个阶段相互依赖,不应并行运行。因此,当您在联合操作之前调用操作并持久保存Dataframe时,将首先执行stage-1,因为它在结尾处有一个操作。该阶段完成后,执行第2阶段(即工会行动)。

此时,union所需的数据帧已经计算并由stage-1 保留,因此它将按原样使用,而不是重新计算

希望这能澄清你的怀疑。