如何找到键值对中的公共值并将其作为所有对中的值?
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))
// )
如何获取键值对中值的交集?
我有一对:
(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))
// )