我想在不调用.collect()
的情况下为RDD的每个元素对驱动程序执行操作。第一个想法是使用RDD.toLocalIterator()
:
val config = new SparkConf().setMaster("local[10]").setAppName("xxx")
val sc: SparkContext = new SparkContext(config)
val ints: RDD[Int] = sc.parallelize(1 to 50)
val doubled = ints.map(i => {
Thread.sleep(200)
println(s"map $i" + Thread.currentThread())
i * 2
})
doubled.toLocalIterator.foreach(i => {
println(s"got $i" + Thread.currentThread())
})
但是在这种情况下,下一个分区的计算仅在使用前一个分区后开始。因此整体计算需要花费太多时间。 我发明了以下黑客:
doubled.cache()
//force rdd to be materialized
println(doubled.count())
//traverse cached rdd
doubled.toLocalIterator.foreach(i => {
println(s"got $i" + Thread.currentThread())
})
有没有更好的解决方案?
答案 0 :(得分:-2)
为什么你不使用RDD.foreach
方法,我认为这可以与你提出问题的例子相同。使用它,您可以通过spark RDD
s