使用循环将条目附加到RDD

时间:2018-01-29 11:59:34

标签: apache-spark rdd

我尝试在循环的每次迭代中向现有RDD追加一个条目。我的代码到现在为止:

var newY = sc.emptyRDD[MatrixEntry]
for (j <- 0 until 8000) {
  var arrTmp = Array(MatrixEntry(j, j, 1))
  var rddTmp = sc.parallelize(arrTmp)
  newY = newY.union(rddTmp)
}

进行这8000次迭代当我尝试从该RDD中取出(10)时出现错误但是如果我尝试使用较小的数字,那么每件事都可以。 错误Exception in thread "main" java.lang.StackOverflowError at scala.collection.TraversableLike$class.builder$1(TraversableLike.scala:229) at scala.collection.TraversableLike$class.map(TraversableLike.scala:233) at scala.collection.immutable.List.map(List.scala:296) at org.apache.spark.rdd.UnionRDD.getPartitions(UnionRDD.scala:84) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) at scala.Option.getOrElse(Option.scala:121)

帮助?

1 个答案:

答案 0 :(得分:2)

您遇到的问题与Stackoverflow due to long RDD Lineage重复,但您的代码根本不应该与之相关。

如果你想要单一矩阵,只需用范围映射:

val newY = spark.sparkContext.range(0, 8000).map(j => MatrixEntry(j, j, 1))

循环并行化不会缩放并保留驱动程序内存中的所有数据Why does SparkContext.parallelize use memory of the driver?