在学习Spark时,似乎基本的工作流程是转换->操作,并获得操作作为最终结果。
我有一个不同的工作流,在这个工作流中,我对计算的最终结果不感兴趣,而是希望基于转换填充一大批Amazon S3文件。(想象一下大规模并行图像处理。)我想这样做:
for each k,v:
v_ = transform(v)
make a new s3 file, with key = k, and contents = v_
除了另一个答案之外,也许还值得考虑RDD.foreachPartition(),它可以一次处理一个整个分区。在推出数据需要大量设置成本的情况下,这是有益的。
transformedRDD.foreachPartition { iteratorOfRecords =>
setup() // do some initial connection setup, etc.
iteratorOfRecords.foreach { keyValue => saveHoweverYouLike(keyValue) }
}
另一个需要注意的小问题。从技术上讲,foreach()也是一个"动作",即使它不返回结果。您必须执行一个操作来强制Spark启动rdd的惰性求值。
似乎最好的方法是简单地编写一个自定义保存方法并执行transform.foreach(x => saveHoweverYouLike(x))