繁体   English   中英

循环内的RDD转换

[英]RDD transformation inside a loop

因此,我有一个名为Adat的rdd:Array [String],我想在一个循环中对其进行转换,并获得一个新的RDD,我可以在循环作用域之外使用它。

val sharedA = {
  for {
    i <- 0 to shareA.toInt - 1  
    j <- 0 to shareA.toInt - 1 
  } yield { 
    Adat.map(x => (x(1).toInt, i % shareA.toInt, j % shareA.toInt, x(2))) 
  }  
}

上面的代码将SharedA rdd转换为IndexedSeq [RDD [(Int,Int,Int,String)]],当我尝试打印它时,结果是:

MapPartitionsRDD[12] at map at planet.scala:99

MapPartitionsRDD[13] at map at planet.scala:99  and so on.

如何将sharedA转换为RDD[(Int, Int, Int, String)]

如果我这样做,则sharedA具有正确的数据类型,但是我不能在范围外使用它。

      for { i <- 0 to shareA.toInt -1 
      j<-0 to shareA.toInt-1 } 
      yield   { 
      val sharedA=Adat.map(x => (x(1).toInt,i % shareA.toInt ,j %      
      shareA.toInt,x(2)))    
       }

我不完全了解您的描述,但是flatMap应该可以解决问题:

val rdd = sc.parallelize(Seq(Array("", "0", "foo"), Array("", "1", "bar")))
val n = 2

val result = rdd.flatMap(xs => for {
  i <- 0 to n
  j <- 0 to n
} yield (xs(1).toInt, i, j, xs(2)))

result.take(5)
// Array[(Int, Int, Int, String)] =
//   Array((0,0,0,foo), (0,0,1,foo), (0,0,2,foo), (0,1,0,foo), (0,1,1,foo))

不太常见的方法是在结果上调用SparkContext.union

val resultViaUnion = sc.union(for {
  i <- 0 to n
  j <- 0 to n
} yield rdd.map(xs => (xs(1).toInt, i, j, xs(2))))

resultViaUnion.take(5)
// Array[(Int, Int, Int, String)] = 
// Array((0,0,0,foo), (1,0,0,bar), (0,0,1,foo), (1,0,1,bar), (0,0,2,foo))

暂无
暂无

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

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