如何在循环中覆盖RDD

时间:2017-01-17 04:32:41

标签: scala apache-spark

我是Spark和Scala的新手,我正在实现一个操纵大图的迭代算法。假设在for循环中,我们有两个RDD(rdd1和rdd2)并且它们的值得到更新。例如:

for (i <- 0 to 5){
   val rdd1 = rdd2.some Transformations
   rdd2 = rdd1
}

基本上,在迭代i + 1期间,rdd1的值基于其在迭代i处的值来计算。 我知道RDD是不可变的,所以我无法真正重新分配给他们,但我只是想知道,我的想法是否有可能实现。如果是这样,怎么样?非常感谢任何帮助。

谢谢,

更新: 当我尝试这段代码时:

var size2 = freqSubGraphs.join(groupedNeighbours).map(y => extendFunc(y))

for(i <- 0 to 5){
    var size2 = size2.map(y=> readyForExpandFunc(y))
}
size2.collect()

它给了我这个错误:“递归变量size2需要类型” 我不确定这是什么意思

3 个答案:

答案 0 :(得分:1)

为什么不打开火花壳并试试呢?

scala> var rdd1 = sc.parallelize(List(1,2,3,4,5))
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24

scala> for( i <- 0 to 5 ) { rdd1 = rdd1.map( _ + 1 ) }

scala> rdd1.collect()
res1: Array[Int] = Array(7, 8, 9, 10, 11)                                       

如你所见,它有效。

答案 1 :(得分:1)

为了完整起见,如果您希望自己的代码更纯粹是惯用的话,可以使用foldRight来避免使用可变var

val zeroRdd = freqSubGraphs.join(groupedNeighbours).map(y => extendFunc(y))
val size2 = (0 to 5).foldRight(zeroRdd) {
  (_, rdd) => rdd.map(y => readyForExpandFunc(y))
}

答案 2 :(得分:0)

parent.jQuery.fancybox.close();上访问数据的方式取决于其结构。如果要使用单个项目中的数据执行某些计算,则可以直接使用RDD

map

如果您的val intRDD = spark.sparkContext.parallelize(Seq(1,2,3,4,5)) val multipliedBy10 = intRDD.map(myInteger=>myInteger*10) print(multipliedBy10.collect.toList) // output: List(10, 20, 30, 40, 50) 包含多个值(例如:一个元组),则可以执行以下操作:

RDD

如果您还需要来自其他val tupleRDD = spark.sparkContext.parallelize(Seq(('A', 1), ('B', 2), ('C', 3))) val concatTuple = tupleRDD.map(tuple=>tuple._1 + "-" + tuple._2) print(concatTuple.collect.toList) // output: List(A-1, B-2, C-3) 的数据来进行计算,我建议您先将两个RDD的数据都加入