2017-10-08 77 views
-1

我有一個RDD像這樣(所有的數字都是智力)鍵的組合:如何生成值對Apache的火花(斯卡拉)

(2,List(2,2,7)) 
(7,List(9,7,9)) 
(9,List(2,7,9)) 

如何產生的RDD使得對於每個列表中,我們擁有密鑰的所有可能性:

(2,List(2,2,7)) 
(7,List(2,2,7)) 
(9,List(2,2,7)) 
(2,List(9,7,9)) 
(7,List(9,7,9)) 
(9,List(9,7,9)) 
(2,List(2,7,9)) 
(7,List(2,7,9)) 
(9,List(2,7,9)) 

跟進,我需要計算每一行的計數時,關鍵值等於在列表中的值,例如,

(2,List(2,2,7)) results in (2, 2) since there are two 2s in the list 
(7,List(2,2,7)) results in (7, 1) since there is one 7 in the list 

回答

1

要生成我會使用類似

rdd.map(_._1).cartesian(rdd.map(_._2))

所有可能的鍵值對,給了恰好

(2,List(9, 7, 9)) 
(2,List(2, 7, 9)) 
(7,List(2, 2, 7)) 
(7,List(9, 7, 9)) 
(7,List(2, 7, 9)) 
(9,List(2, 2, 7)) 
(9,List(9, 7, 9)) 
(9,List(2, 7, 9)) 
(2,List(2, 2, 7)) 

對於您可以使用地圖最終結果:

rdd.map(_._1).cartesian(rdd.map(_._2)).map{case (k, v) => {(k, v, v.count(_ == k))}} 

(2,List(2, 2, 7),2) 
(2,List(2, 7, 9),1) 
(7,List(2, 7, 9),1) 
(2,List(9, 7, 9),0) 
(7,List(2, 2, 7),1) 
(9,List(2, 2, 7),0) 
(9,List(9, 7, 9),2) 
(7,List(9, 7, 9),1) 
(9,List(2, 7, 9),1) 

你可以從最終的元組中排除列表本身,我添加它只是爲了檢查它是否正確。 在你的問題方面,檢查清單是null,並以適當的方式處理它可能非常有用