如何找到键值对中的公共值并将其作为所有对中的值?

How to find the common values in key value pairs and put it as value in all pairs?

如何获取键值对中值的交集?

我有一对:

(p, Set(n))

其中我用了reduceByKey最后得到:

(p1, Set(n1, n2)) (p2, Set(n1, n2, n3)) (p3, Set(n2, n3))

我想要的是找到存在于所有对中的n并将它们作为值。对于上述数据,结果将

(p1, Set(n2)) (p2, Set(n2)), (p3, Set(n2))

我一搜,spark里面没有reduceByValue。唯一看起来更接近我想要的函数是 reduce() 但它不起作用,因为结果只有一个键值对 ((p3, Set(n2))).

有什么办法可以解决吗?还是我应该从一开始就想点别的?

代码:

val rRdd = inputFile.map(x => (x._1, Set(x._2)).reduceByKey(_++_)

val wrongRdd  = rRdd.reduce{(x, y) => (x._1, x._2.intersect(y._2))}

我明白为什么 wrongRdd 是不正确的,我只是想说明 (p3, Set(n2)) 是如何产生的。

您可以先 reduce 集合到它们的交集(比如 s),然后将 (k, v) 替换为 (k, s):

val rdd = sc.parallelize(Seq(
  ("p1", Set("n1", "n2")),
  ("p2", Set("n1", "n2", "n3")),
  ("p3", Set("n2", "n3"))
))

val s = rdd.map(_._2).reduce(_ intersect _)
// s: scala.collection.immutable.Set[String] = Set(n2)

rdd.map{ case (k, v) => (k, s) }.collect
// res1: Array[(String, scala.collection.immutable.Set[String])] = Array(
//   (p1,Set(n2)), (p2,Set(n2)), (p3,Set(n2))
// )