循环内的RDD转换

时间:2015-12-17 20:10:25

标签: scala apache-spark rdd

所以我有一个名为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)))    
       }

1 个答案:

答案 0 :(得分:0)

我不完全理解您的描述,但C++应该做到这一点:

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