【问题标题】:find set of keys in Scala map where values overlap在 Scala 映射中查找值重叠的键集
【发布时间】:2020-08-30 16:09:22
【问题描述】:

我正在使用 scala 中的地图对象,其中键是篮子 ID,值是篮子中包含的一组项目 ID。目标是获取此地图对象并为每个篮子计算一组其他篮子 ID,其中至少包含一个常见项目。

说输入地图对象是

val basket = Map("b1" -> Set("i1", "i2", "i3"), "b2" -> Set("i2", "i4"), "b3" -> Set("i3", "i5"), "b4" -> Set("i6"))

是否可以在 spark 中执行计算,以便我得到相交的篮子信息?例如 val intersects = Map("b1" -> Set("b2", "b3"), "b2" -> Set("b1"), "b3" -> Set("b1"), "b4" -> Set())

谢谢!

【问题讨论】:

  • 为什么会出现在 spark 标签中?

标签: scala apache-spark maps spark3


【解决方案1】:

类似...

val basket = Map("b1" -> Set("i1", "i2", "i3"), "b2" -> Set("i2", "i4"), "b3" -> Set("i3", "i5"), "b4" -> Set("i6"))

def intersectKeys( set : Set[String], map : Map[String,Set[String]] ) : Set[String] = {
  val checks = map.map { case (k, v) =>
    if (set.intersect(v).nonEmpty) Some(k) else None
  }
  checks.collect { case Some(k) => k }.toSet
}

// each set picks up its own key, which we don't want, so we subtract it back out
val intersects = basket.map { case (k,v) => (k, intersectKeys(v, basket) - k) }

【讨论】:

  • 我尝试对我的整个问题执行这个解决方案,并注意到我的数据预处理不是很可扩展。我想知道您是否有任何想法如何使其更具可扩展性,只需在此处分享链接:stackoverflow.com/questions/63677703/…
  • 一些非常简单的事情可能会加快速度...set.intersect(v).nonEmpty 是浪费,它会计算您只是在寻找重叠的两个集合的完整交集。你可以试试set.find( e => v(e) ).nonEmpty,它只会搜索第一个关节元素。最后一步,可以并行化,可以像basket.par.map { ... }.toMap一样简单(我没有尝试过这些东西,只是一些快速的想法。)
猜你喜欢
  • 2020-10-06
  • 2012-01-08
  • 2019-07-23
  • 2021-12-23
  • 2018-09-25
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多