簡體   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