2017-03-17 58 views
0

我正在用這種方式構建對的RDD:[Int,List [Int]]我的目標是映射每個鍵對的列表項。因此,例如我需要這樣做:在Spark中映射列表中的每個元素

RDD1:[Int, List[Int]] 
<1><[2, 3]> 
<2><[3, 5, 8]> 

RDD2:[Int, Int] 
<1><2> 
<1><3> 
<2><3> 
<2><5> 
<2><8> 

以及我不明白爲了達到RDD2需要什麼樣的轉換。轉換列表可以在here找到。任何想法?這是一個錯誤的方法?

回答

2

您可以使用flatMap

val rdd1 = sc.parallelize(Seq((1, List(2, 3)), (2, List(3, 5, 8)))) 
val rdd2 = rdd1.flatMap(x => x._2.map(y => (x._1, y))) 

// or: 
val rdd2 = rdd1.flatMap{case (key, list) => list.map(nr => (key, nr))} 

// print result: 
rdd2.collect().foreach(println) 

給出了結果:

(1,2) 
(1,3) 
(2,3) 
(2,5) 
(2,8) 

flatMap創建幾個輸出對象從一個輸入對象。

在你的情況中,f​​latMap中的內部映射將元組(int,List [Int])映射到List [(Int,Int)] - 鍵與輸入元組相同,但是對於輸入列表中的每個元素,輸出元組。 flatMap導致此列表中的每個元素都成爲RDD中的一行

+0

謝謝,我愚蠢地認爲在地圖(或flatMap)內部製作地圖是錯誤的。我是初學者。非常感謝你。 – Matt

+1

@Matt內部映射不是Spark的轉換 - 它是標準的Scala List操作:)所以你可以在flatMap中使用它。您不能僅使用其他Spark操作和轉換,即RDD,DataFrame或Dataset上的映射 –

相關問題