scala方法—aggregate

Scala中的aggregate方法

这个函数还是比较有意思的,在spark中也会常常用到

一、首先举一个计算字符串内字符出现次数的例子:

//统计字母出现的频率映射
def strfreq(str:String):mutable.Map[Char,Int]={
  val strlist=str.toList
  //strlist.aggregate()
  val countsMap=strlist.aggregate(mutable.Map[Char,Int]())((agg:mutable.Map[Char,Int], char)=>{
    if(!agg.contains(char)){
      agg.put(char,1)
    }else{
      agg.put(char,agg(char)+1)
    }
    agg
  },(agg1:mutable.Map[Char,Int],agg2:mutable.Map[Char,Int])=> {//由于这里没有分区,则此处并没有执行此方法
      for((word,count)<-agg1){
        if(!agg2.contains(word)){
          agg2.put(word,1)
        }else{
          agg2.put(word,agg2(word)+count)
        }
      }
      agg2
    }
  )
  countsMap
}
测试:
val str="hgjhdg"
println(strfreq(str))

测试结果截图:

然后来深入解析一下这个aggregate函数
 

二、对aggregate的理解

1.先来看官方API
aggregate方法(2.13.0后已被其他函数替换,但是作用类似):
函数形式:

函数内容:

 
2.大致描述:
该方法对子集合(元素)进行聚合运算,此方法 类似于foldLeft,它不要求返回值必须是元素类型的超类( 并不要求返回值类型与接受值类型一致),此外,aggregate方法将集合分片 (split),它可以对多个被分割的集合并行操作(对分块的集合进行操作: seqop)【 最少对一个元素进行操作】,并最后组合( combop)起来【 最少0次组合操作】。
 
3.参数详解:
(1)可以看到主要有五个参数:B , z , seqop ,A , combop
①B:集合类型
②z:作为积累的初始值,指在z的基础上执行后面的函数操作,其类型应该和函数返回值的类型相同
③seqop:定义在一个部分(partition)内对元素的操作【相当于一个表达式】,并返回该部分的计算结果(results)
④A:表示要执行aggregate函数的集合的元素,在seqop方法体内一一执行对应操作
⑤combop:该运算符用于合并来自不同分区的结果,并最终返回想要的聚合结果
(2)对API给出的例子进行解释
首先是传入集合为['a','b','c'],返回的值为'a'、'b'、'c'三个字符(列表内字符串)转化为int类型后的整型值的和
详细如图:

 

三、看看被替换成foldLeft(z)(seqop)怎么使用

可以看最新的2.13.1版本的API

其中参数表示的内容说的很明白了,表面上看在这里其实就是将前面的aggregate的seqop以前的部分保留下来,combop部分去除了,现在还没有学习spark,不知道这个改动对并发计算有什么影响,是否真的可以使用这个函数完全代替aggregate,等学习spark后,再来补上这个困惑。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值