在行动之前UNION父rdd和孩子rdd会发生什么?

时间:2017-08-10 10:22:34

标签: hadoop apache-spark rdd

假设我有一些rdd有这样的血统:

rdd0 - > rdd1 - > rdd2 - > rdd3 - > rdd4

当我执行rdd1.union(rdd2).union(rdd3).union(rdd4).collect()时会发生什么?在计算rdd4时,spark会重新计算从rdd0到rdd3的转换吗?

2 个答案:

答案 0 :(得分:1)

union是一种转换,因此当您执行val x = a union(b)时,它会向标识符x引用的谱系添加一个新元素。此时没有真正计算出来的东西。可以把它想象成添加了元素的蓝图。在x上调用操作时,将从添加的第一个元素开始执行此蓝色打印。

现在,在您的情况下,当您执行rdd1.union(rdd2).union(rdd3).union(rdd4).collect()时,您基本上在蓝图中添加了3个元素(rdd1rdd2的结果,rdd3的联合以前的结果和rdd4与先前结果的联合)。现在,当你在最终结果上调用collect()时,蓝图终于从头开始执行。

如果您使用rdd1进行大量操作,最好缓存/保留它,否则会重新计算。

让我知道这是否有帮助,干杯。

答案 1 :(得分:0)

当你调用union时,spark会得到一个新的RDD。这个RDD让成员ro保持其父级来计算它的依赖性。依赖性用于生成DAG。 DAG用于在调用动作时生成阶段。