Spark算子 - aggregateByKey
释义
- aggregateByKey逻辑类似 aggregate,但 aggregateByKey针对的是PairRDD,即键值对 RDD,所以返回结果也是 PairRDD,结果形式为:(各个Key, 同样Key对应的Value聚合后的值)
- aggregateByKey先将每个partition内元素进行分组计算,然后将每个partition的计算结果进行combine,得到最终聚合结果。且最终结果允许跟原始RDD类型不同
方法签名如下:
def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U, combOp: (U, U) => U): RDD[(K, U)] = self.withScope {
...
}
- zeroValue: 每个partition的聚合初始值
- seqOp: sequence operation,对partition内数据进行映射,最终1个partition只有1个结果。输入类型为U跟V,输出为U,即每次操作结果要跟zeroValue类型一致
- 第一次操作时,U为zeroValue(初始值),第一次操作之后输出结果U,作为下一次操作的U
- 第二次操作及之后操作时,U为前一次操作输出结果,而不再是zeroValue
- combOp: combine operation,对每个partition的结果进行combine操作。输入类型为U跟U,输出为U,即输入类型与输出类型一致,最终结果为:(K, U)类型的PairRDD
案例
统计单词个数 WordCount
object TestAggregateByKey {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("TestAggregateByKey").setMaster("local[1]")
val sc = new SparkContext(conf)
val data = Array("hello world", "simple app is good", "good world")
val result: Array[(String, Int)] = sc.parallelize(data, 1)
.flatMap(_.split(" "))
.map((_, 1))
.aggregateByKey(0)(
(cnt1: Int, cnt2: Int) => cnt1 + cnt2,
(partitionAllCnt1: Int, partitionAllCnt2: Int) => partitionAllCnt1 + partitionAllCnt2
)
.collect()
result.foreach(println)
}
}
输出
(is,1)
(app,1)
(simple,1)
(hello,1)
(good,2)
(world,2)
解释
- 先将每个词map成 (词语, 1)的形式
- 调用aggregateByKey之后,每个partition内已经按key进行分组了,之后传入初始值0作为每个组的个数,接着进行 cnt1 + cnt2,就是同个key内进行1+1操作,比如单词good 有两个value都是1,此时单词good的组内,计算的值即为2
- 所有partition的结果进行计算
Spark算子 - aggregateByKey的更多相关文章
- 对spark算子aggregateByKey的理解
案例 aggregateByKey算子其实相当于是针对不同“key”数据做一个map+reduce规约的操作. 举一个简单的在生产环境中的一段代码 有一些整理好的日志字段,经过处理得到了RDD类型为( ...
- spark-聚合算子aggregatebykey
spark-聚合算子aggregatebykey Aggregate the values of each key, using given combine functions and a neutr ...
- Spark:常用transformation及action,spark算子详解
常用transformation及action介绍,spark算子详解 一.常用transformation介绍 1.1 transformation操作实例 二.常用action介绍 2.1 act ...
- (转)Spark 算子系列文章
http://lxw1234.com/archives/2015/07/363.htm Spark算子:RDD基本转换操作(1)–map.flagMap.distinct Spark算子:RDD创建操 ...
- Spark算子总结及案例
spark算子大致上可分三大类算子: 1.Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Value型的数据. 2.Key-Value数据类型的Tran ...
- UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现
UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import ...
- UserView--第一种方式set去重,基于Spark算子的java代码实现
UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...
- spark算子之DataFrame和DataSet
前言 传统的RDD相对于mapreduce和storm提供了丰富强大的算子.在spark慢慢步入DataFrame到DataSet的今天,在算子的类型基本不变的情况下,这两个数据集提供了更为强大的的功 ...
- Spark算子总结(带案例)
Spark算子总结(带案例) spark算子大致上可分三大类算子: 1.Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Value型的数据. 2.Key ...
随机推荐
- SpringBoot 之 国际化
增加国际化i18n语言配置: # src/main/resources/i18n/login.properties login.btn=登录 # src/main/resources/i18n/log ...
- 《Python核心编程第3版中文版》(高清).PDF,免费无需任何解压密码
链接:https://pan.baidu.com/s/18d3xinNX1oH5q8zpB10ABA 提取码:dx7h
- Docker_镜像(image)使用(3)
查找docker镜像 我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/ 我们也可以使用 docker search 命令 ...
- ES6扩展运算符(...)
来自为知笔记(Wiz)
- spring cloud feign 报错 feign.FeignException$MethodNotAllowed: status 405 reading 解决
1.前言 出现报错 feign.FeignException$MethodNotAllowed: status 405 reading XXXXX 需要检查 接口的请求参数是否一致 请求参数是否正确添 ...
- 第10组 Alpha冲刺 (4/6)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13982696.html ·作业博客:https://edu.cnblogs.co ...
- Python面向对象时最常见的3类方法
为了节省读友的时间,先上结论(对于过程和细节感兴趣的读友可以继续往下阅读,一探究竟): [结论] 类中定义的方法类型 关键词 本质含义 如何定义 如何调用 使用场景举例 实例方法 一般无任何修饰时,默 ...
- 从如何使用到如何实现一个Promise
前言 这篇文章我们一起来学习如何使用Promise,以及如何实现一个自己的Promise,讲解非常清楚,全程一步一步往后实现,附带详细注释与原理讲解. 如果你觉的这篇文章有帮助到你,️关注+点赞️鼓励 ...
- 查询并导出表结构为Excel
应公司要求将数据库结构用表格形式来展示给客户,最开始我手工弄了两张表效率实在太低了,于是就想偷懒了,就去网上找了一段儿sql查询语句效率提高了70%一执行就出来了,导出查询结果剩下的就只需要调整一下e ...
- IDEA maven 项目修改代码不生效,mvn clean、install 后才生效
Maven项目进行修改代码后我们重新运行代码,查看我们target目录下的class文件是否发生了变化. 如何查看class文件,鼠标移到项目,点击右键,然后点击 show in Explore ...