假设我有一些rdd有这样的血统:
rdd0 - > rdd1 - > rdd2 - > rdd3 - > rdd4
当我执行rdd1.union(rdd2).union(rdd3).union(rdd4).collect()时会发生什么?在计算rdd4时,spark会重新计算从rdd0到rdd3的转换吗?
答案 0 :(得分:1)
union
是一种转换,因此当您执行val x = a union(b)
时,它会向标识符x
引用的谱系添加一个新元素。此时没有真正计算出来的东西。可以把它想象成添加了元素的蓝图。在x
上调用操作时,将从添加的第一个元素开始执行此蓝色打印。
现在,在您的情况下,当您执行rdd1.union(rdd2).union(rdd3).union(rdd4).collect()
时,您基本上在蓝图中添加了3个元素(rdd1
和rdd2
的结果,rdd3
的联合以前的结果和rdd4
与先前结果的联合)。现在,当你在最终结果上调用collect()
时,蓝图终于从头开始执行。
如果您使用rdd1
进行大量操作,最好缓存/保留它,否则会重新计算。
让我知道这是否有帮助,干杯。
答案 1 :(得分:0)
当你调用union时,spark会得到一个新的RDD。这个RDD让成员ro保持其父级来计算它的依赖性。依赖性用于生成DAG。 DAG用于在调用动作时生成阶段。