编写迭代程序时,常见的情况是您需要定义一个条件,程序将在该条件下停止执行并返回结果。该停止条件可以是例如rdd.isEmpty。问题在于,这种“条件测试”是一种触发任务执行的动作,因此每次迭代都需要计划,序列化和其他成本
def iterate(layer:RDD[Long])={
layer.cache()
if(layer.isEmpty) return null;
val nextlayer=process(layer)//contains hashjoins, joins, filters, cache
iterate(nextlayer)
}
时间线如下所示:
[isempty] [------ spacing ----] [isempty] [------ spacing ----] [isempty]
在这种情况下进行迭代编程的最佳方法是什么?我们不应被迫在每次迭代中启动工作。
有没有一种方法可以检查rdd是否为空?
可能的解决方案:
如下面的图像所示,现在每5次迭代执行一次为空,每次迭代由蓝色矩形的周期性三元组表示。我是通过将停止条件修改为以下内容来做到这一点的:
if(layer.index%5==0 && layer.isEmpty) return null;
但是,如您在下图中所看到的那样,仍然可以执行一些操作,这些操作被执行为“在ThreadPoolExecutor.java中运行”。一项研究表明,这些动作之所以会发生是因为我正在对大型DF进行小型DF的“广播哈希联接”
答案 0 :(得分:0)
您可以尝试使用
layer.cache()
layer.isEmpty
这意味着对empty
的检查将触发操作,但是rdd
将被缓存,因此当您将其传递给process
方法时,在isEmpty
中完成的操作将被“跳过”。