如何在apache spark(scala)中生成键,值对的组合

时间:2017-10-08 18:34:28

标签: scala apache-spark key combinations

我有这样的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

1 个答案:

答案 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并以正确的方式处理它可能非常有用