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函数
https://www.jianshu.com/p/e0fd975055b3

二、对aggregate的理解

1.先来看官方API
https://www.scala-lang.org/api/2.12.10/
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
https://www.scala-lang.org/api/2.13.1/

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

scala方法—aggregate相关推荐

  1. scala 方法重载_Scala中的方法重载

    scala 方法重载 Scala方法重载 (Scala method overloading) Method overloading is a method that is redefined in ...

  2. scala方法中的变量_Scala中的变量

    scala方法中的变量 Scala变量 (Scala variables) A variable is named a reference to a memory location. The loca ...

  3. scala 方法调用_Scala中的方法调用

    scala 方法调用 Scala方法调用 (Scala Method Invocation) Method invocation is the legal and correct technique ...

  4. scala方法中的变量_Scala变量,变量范围,字段变量,方法参数示例

    scala方法中的变量 Variables can be defined as the reserve space in memory to store the assigned values. Ba ...

  5. Scala 方法与函数

    Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法. Scala 中的方法跟 Java 的类似,方法 ...

  6. scala方法定义示例

    方法 方法的表现和行为和函数非常类似,但是它们之间有一些关键的差别. 方法由def关键字定义.def后面跟着一个名字.参数列表.返回类型和方法体. def add(x: Int, y: Int): I ...

  7. Scala方法定义,方法和函数的区别,将方法转换成函数

    1. 定义方法和函数 1.1. 定义方法 方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型 1.2. 定义函数 1.3.方法和函数的区别 在函数式编程语言中,函数是 ...

  8. scala 方法、函数定义小结

    2019独角兽企业重金招聘Python工程师标准>>> package scalapackage.testmethod/*** Created by Germmy on 2018/4 ...

  9. Scala 方法参数列表是val 不可修改

最新文章

  1. MySQL数据表基本操作
  2. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
  3. python编译原理_编译原理实战课 带你吃透编译技术核心概念与算法
  4. springboot日志的级别
  5. [vue] 说下$attrs和$listeners的使用场景
  6. putty保存用户名和密码_社保局官网搬家啦!忘记用户名、密码肿么办?自救指南来一波!...
  7. tensorflow windows
  8. 【正则表达式】正则表达式
  9. 用户登录自动注销问题
  10. ps计算机设置在哪,在哪里设置PS对称渐变工具
  11. 2021世界人工智能大会(WAIC2021):深思考人工智能获颁工信部人工智能产业创新“揭榜优胜单位”!
  12. oracle无效数字紧接着起line,shape数据类型【DOC精选】.doc
  13. 路径正确,但是图片加载不出来
  14. 什么是索引覆盖?什么是索引下推?
  15. 计算机文档翻页怎么设置,PDF文档翻页设置
  16. 如何利用vga接口的显示器做笔记本的副屏
  17. 51单片机精确延时设计
  18. jquery获取复选框checkbox被选中的值
  19. 火箭军计算机网络技术就业方向,计算机系统结构专业就业方向
  20. HDMI各版本的区别

热门文章

  1. 《基于机器学习的雷达辐射源分选与识别技术研究》论文解读
  2. SpringCloud——Feign实例及原理
  3. 怎样用processing代码让你的女朋友对你心服口服
  4. Angular 的 预先(AOT)编译器
  5. 计算机四级考试笔记(专门应付考试)
  6. 工行ICBC_WAPB_B2C支付接口,工行icbc_wapb_b2c
  7. Android版本强制更新
  8. JS String篇 字符串常用Api
  9. 2021-09-25 Kali Linux 安装教程(小白极度友好)
  10. 最新版Kali Purple超详细安装及配置教程-版本简介---(附下载链接)