在我的sparkJob中,我执行一些转换和聚合操作。我需要在管道操作之前和之后通知服务。具体来说,参考下面的代码,我需要在RDD中的所有文档上完成“管道操作1”之后,开始“管道操作2”之前进行服务调用。
JavaRDD<Document> stage_y = stage_x.
map(r -> someRddOperation(r) ).
pipe( "pipe operation 1 to external process" ).
map(r -> someMapOps(r) );
// execute something before processing stage_y
JavaRDD<Document> stage_z = stage_y.
pipe( "pipe operation 2 to another external process" ).
map(r -> someMapOps(r) );
谢谢
答案 0 :(得分:0)
在调用action之前,不执行Spark RDD转换。对于您而言,stage_y
和stage_z
都不会执行。您必须调用一个操作,指定在这些转换后要执行的操作。
通过stage_y
RDD调用的操作完成后,将执行下面的代码。
希望有帮助。
答案 1 :(得分:0)
在对Spark转换进行延迟计算时,它们不运行实际计算就返回另一个RDD。逻辑和物理执行计划是通过操作操作(可能是计数操作或将转换后的数据保存到数据存储)创建的。
此外,两个映射转换可能会创建组合的执行计划,因此您无法区分哪个操作首先执行。
如果您确实需要在特定阶段调用外部进程,则可以考虑将中间的rdd结果保存到数据存储中并运行外部进程。