如何生成值对Apache的火花(斯卡拉)

问题描述:

我有一个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 

要生成我会使用类似

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,并以适当的方式处理它可能非常有用