RDD.toLocalIterator渴望评估

时间:2017-05-18 16:56:40

标签: scala apache-spark

我想在不调用.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())
})

有没有更好的解决方案?

1 个答案:

答案 0 :(得分:-2)

为什么你不使用RDD.foreach方法,我认为这可以与你提出问题的例子相同。使用它,您可以通过spark RDD s

获得并行处理产品的利润