繁体   English   中英

如何在循环中覆盖 RDD

[英]How to overwrite a RDD in a loop

我对 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 需要类型”我不确定这是什么意思

只需打开一个 spark-shell 并尝试一下:

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)                                       

如您所见,它有效。

只是为了完整性,您可以使用foldRight避免使用可变var如果你希望你的代码更纯粹地道:

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

访问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数据来进行计算,我建议您首先加入两个RDD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM