Spark算子 - aggregate
释义
将每个partition内元素进行聚合,然后将每个partition的聚合结果进行combine,得到最终聚合结果。最终结果允许跟原始RDD类型不同
方法签名如下:
def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U = withScope {
  ...
}
- zeroValue: 每个partition的聚合初始值
 - seqOp: sequence operation,对partition内数据进行映射,最终1个partition只有1个结果。输入类型为U跟T,输出为U,即每次操作结果要跟zeroValue类型一致
- 第一次操作时,U为zeroValue(初始值),第一次操作之后输出结果U,作为下一次操作的U
 - 第二次操作及之后操作时,U为前一次操作输出结果,而不再是zeroValue
 
 - combOp: combine operation,对每个partition的结果进行combine操作。输入类型为U跟U,输出为U,即输入类型与输出类型一致。最终结果为:U类型的RDD
 
案例
统计所有单词总长度,单词的总个数
object TestAggregate {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setAppName("TestAggregate").setMaster("local[1]")
    val sc = new SparkContext(conf)
    val data = Array("hello", "world", "simple", "app", "is", "good", "good", "world")
    val result: (Int, Int) = sc.parallelize(data, 2) // 当前设置为2个partition
      .aggregate((0, 0))( //①
        (v: (Int, Int), str: String) => (v._1 + str.length, v._2 + 1), // ②
        (v1: (Int, Int), v2: (Int, Int)) => (v1._1 + v2._1, v1._2 + v2._2) // ③
      )
    println(result)
  }
}
输出
(34,8)
解释
- 在每个partition内传入初始值(0, 0),如①处
 - 之后每个partition内开始进行聚合计算,如②处。每个partition内的单词长度累加,放入结果二元组的第一位;每处理一个单词,结果二元组的第二位加一,即单词个数加一
 - 每个partition的结果二元组再进行汇总操作,如③处。最终形成一个二元组,第一位是所有字母的总长度,第二位是所有单词的总个数
 
Spark算子 - aggregate的更多相关文章
- (转)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 ...
 - Spark算子总结(带案例)
		
Spark算子总结(带案例) spark算子大致上可分三大类算子: 1.Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Value型的数据. 2.Key ...
 - 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算子实战应用 数据集 :http://grouplens.org/datasets/movielens/ MovieLens 1M Datase 相关数据文件 : users.dat --- ...
 - spark算子集锦
		
Spark 是大数据领域的一大利器,花时间总结了一下 Spark 常用算子,正所谓温故而知新. Spark 算子按照功能分,可以分成两大类:transform 和 action.Transform 不 ...
 - Spark算子使用
		
一.spark的算子分类 转换算子和行动算子 转换算子:在使用的时候,spark是不会真正执行,直到需要行动算子之后才会执行.在spark中每一个算子在计算之后就会产生一个新的RDD. 二.在编写sp ...
 
随机推荐
- 03.python封装与解构
			
封装与结构 基本概念 t1 = 1, 2 print(type(t1)) # 什么类型 t2 = (1, 2) print(type(t2)) Python等式右侧出现逗号分隔的多值的时候,就会将这几 ...
 - centos7 自动交互expect  安装使用
			
1.安装 https://www.cnblogs.com/rocky-AGE-24/p/7256800.html 安装expect命令 两种方式yum安装 yum -y install expect ...
 - spring-aop(二)学习笔记
			
常用增强处理类型 增强处理类型 特点 before 前置增强处理,在目标方法前织入增强处理 ...
 - Java|从Integer和int的区别认识包装类
			
https://blog.csdn.net/darlingwood2013/article/details/96969339?utm_medium=distribute.pc_relevant.non ...
 - java调用redis的多种方式与心得
			
心得: /** * 心得: * 1.连接方式主要有:直连同步,直连事务,直连管道,直连管道事务,分布式直连同步,分布式直连管道, * 分布式连接池同步,分布式连接池管道:普通连接池同步,普通连接池管道 ...
 - $.ajax传输js数组,spring接收异常
			
今天测试,出现一个奇怪的问题 $.ajax传输js数组,spring接收这个数组,出现奇怪的现象,如果数组只有一个元素,且这个元素字符串最后一个字符是以逗号,结尾的话, spring会自动把这个逗号去 ...
 - 开源数据可视化BI工具SuperSet(使用)
			
上一篇介绍了Linux 下如何安装SuperSet ,本篇简单介绍一下如何使用 1.输入安装时设置的用户名密码登录控制台 2.控制界面如下 3.第一步添加数据源(已安装好的mysql) 点击 da ...
 - k8s的应用包管理工具helm的部署和使用
			
1.概述 我们一般是在k8s里面部署一些简单的应用,比如用deployment,daemonset,statefuleset的方式来部署应用,但是如果要部署一些复杂的应用,那么整个配置的编写.部署的过 ...
 - Linux下Julia安装
			
1.找到官网,执行 wget https://julialang-s3.julialang.org/bin/linux/x64/1.4/julia-1.4.0-linux-x86_64.tar.gz ...
 - 【涨姿势】原来golang的case <-time.After(xxx)还有这样的坑
			
偶然看到这样一篇文章:<使用 pprof 排查 Golang 内存泄露>https://www.toutiao.com/i6881796351139676680/ 最后一段让我很疑惑: 修 ...