【问题标题】:How to find the common values in key value pairs and put it as value in all pairs?如何找到键值对中的共同值并将其作为所有对中的值?
【发布时间】:2018-10-07 16:13:37
【问题描述】:

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

我有一对:

(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)) 是如何产生的。

【问题讨论】:

  • 减少后,您将拥有想要放入每一对的值,如果有的话。现在你需要再用map 来替换

标签: scala apache-spark key-value


【解决方案1】:

您可以先将 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))
// )

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 2020-05-17
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多