加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 使用`aggregate`合并地图

发布时间:2020-12-16 18:30:52 所属栏目:安全 来源:网络整理
导读:例如,对于任何给定的Map集合, val in = Array( Map("a" - 1,"b" - 2),Map("a" - 11,"c" - 4),Map("b" - 7,"c" - 10)) 如何在in.par上使用聚合以便将地图合并到 Map ( "a" - 12,"b" - 9,"c" - 14 ) 注意已多次询问地图合并,但寻找在并行集合上使用聚合的解决
例如,对于任何给定的Map集合,

val in = Array( Map("a" -> 1,"b" -> 2),Map("a" -> 11,"c" -> 4),Map("b" -> 7,"c" -> 10))

如何在in.par上使用聚合以便将地图合并到

Map ( "a" -> 12,"b" -> 9,"c" -> 14 )

注意已多次询问地图合并,但寻找在并行集合上使用聚合的解决方案.

非常感谢

解决方法

如何将seqop和comboop应用于合并?

val in = Array(
  Map("a" -> 1,"c" -> 10)
)

def merge(m1: Map[String,Int],m2: Map[String,Int]): Map[String,Int] =
  m1 ++ m2.map { case (k,v) => k -> (v + m1.getOrElse(k,0)) }

in.par.aggregate(Map[String,Int]())(merge,merge)

更新

您传递给聚合初始累加器值(空映射)和两个闭包 – seqop和comboop.

并行序列在几个分区中分割以并行处理.通过将seqop连续应用于累加器和数组元素来处理每个分区.

def seqop(
    accumulator: Map[String,element: Map[String,Int] = merge(accumulator,element)

seqop获取初始累加器值和第一个数组元素并合并它.接下来它将获取前一个结果和下一个数组元素,依此类推,直到整个分区合并到一个映射中.

当每个分区在单独的映射中合并时,应通过应用comboop来组合这些映射. comboop从第一个分区获取合并的映射,从第二个分区获取合并的映射并将它们合并在一起.接下来它需要先前的结果和第三个分区的映射,直到所有内容都合并到一个映射中.这是聚合的结果.

def comboop(
    m1: Map[String,Int] = merge(m1,m2)

seqop和comboop是一样的巧合.通常,它们的逻辑和签名不同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读