在操作之前联合父rdd和子rdd会发生什么?

pobjuy32  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(311)

假设我有一些rdd有这样的血统:
rdd0->rdd1->rdd2->rdd3->rdd4
执行rdd1.union(rdd2).union(rdd3).union(rdd4).collect()时会发生什么?在计算rdd4时,spark会重新计算从rdd0到rdd3的转换吗?

z9ju0rcb

z9ju0rcb1#

union 是一种转变,所以当你 val x = a union(b) ,它向标识符引用的沿袭添加一个新元素 x . 在这一点上没有什么是真正计算出来的。把它想象成一个添加了元素的蓝图。当一个动作被调用时 x ,此蓝图从添加的第一个元素开始执行。
现在,在你的情况下,当你 rdd1.union(rdd2).union(rdd3).union(rdd4).collect() ,您基本上在您的蓝图中添加了3个元素( rdd1 以及 rdd2 ,联合 rdd3 与先前的结果和并集 rdd4 上一个结果)。现在,当您调用 collect() 在这最后的结果。
以防您使用 rdd1 对于许多操作,最好缓存/持久化它,否则它将重新计算。
让我知道这是否有用,干杯。

6qqygrtg

6qqygrtg2#

当你调用union时,spark将得到一个新的rdd。这个rdd让成员保留它的父级来计算它的依赖性。依赖关系用于生成dag。dag用于在调用action时生成stage。

相关问题