我有这样的RDD(所有数字都是Int):
(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
答案 0 :(得分: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))
对于最终结果,您可以使用map:
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
并以正确的方式处理它可能非常有用