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 ...
随机推荐
- linux 之 导出远程oracle数据库表结构及数据
导出用户下所有表结构及数据 exp 用户名/密码@ip/数据库 file=文件路径/文件名.dmp owner='用户' 导出用户下所有表结构,不导出数据 exp 用户名/密码@ip/数据库 file ...
- Django_通用视图(五)
参考官网的投票系统,按照综合案例的流程创建应用polls,主要模块代码如下: test1/polls/models.py import datetime from django.db import m ...
- 关于Mysql的Qcache优化
query_cache_size = 64M 指定MySQL查询缓冲区的大小.可以通过在MySQL控制台执行以下命令观察:# > SHOW VARIABLES LIKE '%query_cach ...
- Hive建表和内外部表的使用
原文链接: https://www.toutiao.com/i6766784274965201415 一.普通建表方式 create table stu_info( id int, name stri ...
- python2.7发送邮件失败之——SMTPAuthenticationError问题
使用python2.7发送邮件,代码如下: from email.header import Headerfrom email.mime.text import MIMETextimport smtp ...
- 【reverse】逆向3 寻找地址
[reverse]逆向3 寻找地址 寻址公式一:[立即数] 读取内存的值: mov eax,dword prt ds:[0x13FFC4] 将内存编号为0x13FFC4.0x13FFC5.0x13FF ...
- gin初识
Gin 是一个用 Go (Golang) 编写的 web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍. 如果你是性能和 ...
- centos7无法访问虚拟机web服务
第一种: 先看下防火墙状态:firewall-cmd --state 关闭防火墙再试试:systemctl stop firewalld.service 第二种,不想关闭防火墙 放开http服务 fi ...
- 浅谈kali : arpspoof工具原理
Arpspoof工具 介绍 arpspoof是一个通过ARP协议伪造数据包实现中间人攻击的kali工具. 中间人攻击虽然古老,但仍处于受到黑客攻击的危险中,可能会严重导致危害服务器和用户.仍然有很多变 ...
- C++ 反汇编:关于Switch语句的优化措施
流程控制语句是C语言中最基本的判断语句,通常我们可以使用IF来构建多分支结构,但同样可以使用Switch语句构建,Switch语句针对多分支的优化措施有4种形式,分别是,IF-ELSE优化,有序线性优 ...