Scala 循环内的RDD转换

Scala 循环内的RDD转换,scala,apache-spark,rdd,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

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

对于{i我不完全理解你的描述,但是
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))

我不明白你的代码有什么意义:(代码< > %%Sule.ToT> <代码> j%sAuth.ToT<<代码>应该是简单地等于<代码> i>代码>和<>代码> j>代码>是唯一的更改元素。你能提供示例输入和预期输出吗?SHARCH已经计算出来了,把它看作是一个小整数,但它并不重要,让我们在开始HAV时说RDD ADAT。e一些用逗号分隔的数据,在循环的帮助下,我想使用i和j添加更多的数据,我想得到一个新的RDD的结果,我可以在范围之外使用它。
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))
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))