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