我们有两个数据帧df1
和df2
,并且正在对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)
那么,为什么在unionAll
应用于未加载的数据帧时,处理阶段会重复。
Spark-version - 1.6.1 Scala版本 - 2.10.6
答案 0 :(得分:2)
Spark DAG调度程序将您的第一组转换分为一个阶段,将union操作分隔为另一个阶段。此外,DAG计划决定这两个阶段可以并行运行,因为它们不是相互依赖,而是相互依赖。
因此,当它并行运行两个阶段时,同一组转换将同时运行。
避免这种情况的解决方案是显示这两个阶段相互依赖,不应并行运行。因此,当您在联合操作之前调用操作并持久保存Dataframe时,将首先执行stage-1,因为它在结尾处有一个操作。该阶段完成后,执行第2阶段(即工会行动)。
此时,union所需的数据帧已经计算并由stage-1 保留,因此它将按原样使用,而不是重新计算。
希望这能澄清你的怀疑。