Spark中对键值对RDD(pairRDD)基于键的聚合函数中,都是通过combineByKey()实现的。

它可以让用户返回与输入数据类型不同的返回值(可以自己配置返回的参数,返回的类型)

首先理解:combineByKey是一个聚合函数,实际使用场景比如,对2个同学的3门考试科目成绩,分别求出他们的平均值。

(也就是对3门考试成绩进行聚合,用一个平均数来表示)

combineByKey是通过3个内部函数来解决这个问题的:

具体处理过程为:遍历分区中的所有元素,因此每一个元素的键要么没有遇到过,要么就和之前的键相等。

它的参数形式为:combineByKey(1.createCombiner,2.mergeValue,3.mergeCombiners,4.partioner)

比如,我有一个数组{1,2,1,2,4}

具体流程为:第一次遇到1,调用createCombiner()函数。

2.第一次遇到2,调用createCombiner()函数。

3.第二次遇到1,调用mergeValue()函数。

4.第二次遇到2,调用mergeValue()函数。

5.第一次遇到4,调用mergeValue()函数。

接下来解释每一个函数的作用

1.createCombiner():在遍历过程中,遇到新的键,就会调用createCombiner()函数。这个过程会发生在每一个分区内,因为RDD中有不同的分区,也就有同一个键调用多次createCombiner的情况。

2.mergeValue() 遇到已经重复的键,调用mergeValue()函数。

3.mergeCombiners() 如果有2个或者更多的分区,会把分区的结果合并。

4.pationer  分区函数()

举例:

准备数据:

val scores =sc.parallelize(Array(
("jack",89.0),
("jack",82.0),
("jack",92.0),
("tom",88.0),
("tom",89.0),
("tom",98.0)
))

  数据为jack和tom的3门科目成绩,要对jack和tom的平均成绩进行输出。

1.遍历过程中,统计课程的数目,同时计算总分。

val score2=scores.combineByKey(x =>(1,x) ,
(c1:(Int,Double),newScore)=>(c1._1+1,c1._2+newScore),
(c1:(Int,Double),c2:(Int,Double))=>(c1._1+c2._1,c1._2+c2._2))

详解:

x =>(1,x)   将scores的value转化为(1,value)的格式
(c1:(Int,Double),newScore)=>(c1._1+1,c1._2+newScore)  遇到重复的key:我们对value的处理过程为:
之前计算的结果定义为newScore,对c1:(c1._1,c2._2)处理过程为:(c1._1+1,c2._2+newScore)  
实际意义为:再次遍历到jack时,我们将科目数量+1,将统计的总分再加上遍历到的分数。
(c1:(Int,Double),c2:(Int,Double))=>(c1._1+c2._1,c1._2+c2._2)) 对2个不同的分区c1,c2(这2个分区,他的键相同,都是Jack)
最后我们将不同分区的结果相加。
比如我们还有另一个分区("jack",45) 代表c2。我们要将Jack的科目数+1,总分+45. 获得最终结果

统计得到的结果:得到姓名:科目+总分

scala> score2.foreach(println)
(tom,(3,275.0))
(jack,(3,263.0))

  

2.求平均值:

val average=score2.map{case(name, (num,score) )=>(name,score/num) }
结果: average.foreach(println)
(tom,91.66666666666667)
(jack,87.66666666666667)

Spark聚合操作:combineByKey()的更多相关文章

  1. Spark GraphX 聚合操作

    package Spark_GraphX import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.graph ...

  2. Spark RDD 操作

    1. Spark RDD 创建操作 1.1 数据集合   parallelize 可以创建一个能够并行操作的RDD.其函数定义如下: ) scala> sc.defaultParallelism ...

  3. spark中的combineByKey函数的用法

    一.函数的源码 /** * Simplified version of combineByKeyWithClassTag that hash-partitions the resulting RDD ...

  4. Update(Stage4):sparksql:第3节 Dataset (DataFrame) 的基础操作 & 第4节 SparkSQL_聚合操作_连接操作

    8. Dataset (DataFrame) 的基础操作 8.1. 有类型操作 8.2. 无类型转换 8.5. Column 对象 9. 缺失值处理 10. 聚合 11. 连接 8. Dataset ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9  关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...

  6. MongoDB 聚合操作

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  7. .NET LINQ 聚合操作

    聚合操作      聚合运算从值集合计算单个值. 从一个月的日温度值计算日平均温度就是聚合运算的一个示例. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 ...

  8. Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)

    在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...

  9. OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念

    先看下 http://www.cnblogs.com/bonelee/p/6236962.html 这里对于环形数据库的介绍,便于理解归档这个操作! 转自:http://blog.sina.com.c ...

随机推荐

  1. [转]C#调用C++类(以COM组件的形式)

    如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组 ...

  2. kubernetes 网络模型

    在Kubernetes模型中,每个Docker主机的docker0网桥都是可以路由的. 那就是说,当一个Pod部署后,集群其他主机能够不在物理主机上做端口映射就可以直接访问Pod. 有了这种说法,从网 ...

  3. haproxy + lvs异同(优点-缺点)

    LVS和HAProxy相比,它的异同是什么? 1.  两者都是如软件负载均衡.但lVS是基于linux操作系统实现的一种软负载均衡,Haproxy是根据第三 方应用实现的软负载均衡. 2.  LVS是 ...

  4. 流程一直处于Running状态,应该怎么停止?

    流程一直处于Running状态,应该怎么停止? 概述 我们有遇到这种情况:可能由于某些原因,流程发起后一直处于Running状态,然后我们想Stop掉这些出问题的流程,这个时候你在Workspace里 ...

  5. 你知道CAN/RS-485总线为什么要隔离吗?

    您在使用CAN或RS-485总线进行调试时,是否遇到过偶尔通信出错?或者接收不到数据?一直正常使用的总线,突然出现大范围的错误,或者节点损坏?您还在为这些问题不知所措,摸不着头脑吗?使用总线隔离,或许 ...

  6. iOS 内存管理之属性关键字

    你好2019!一起努力呀! 主要分三种类型: 1.原子操作相关: nonatomic.atomic nonatomic:非原子操作,对属性赋值的时候不加锁,多线程并发访问会提高访问效率 atomic: ...

  7. HTTP中常见的各种状态码详解及解决方案

    总结了一些常见的http的状态码,以及常见的解决方案. 一.各范围内状态码大致含义 1xx:临时响应(Informational),需要请求者继续执行操作的状态代码,表示服务器正在接受请求. 2xx: ...

  8. day 83 Vue学习三之vue组件

    本节目录 一 什么是组件 二 v-model双向数据绑定 三 组件基础 四 父子组件传值 五 平行组件传值 六 xxx 七 xxx 八 xxx 一 什么是组件 首先给大家介绍一下组件(componen ...

  9. scala_类的继承

    Scala继承一个基类跟Java很相似, 但我们需要注意以下几点: 重写一个非抽象方法必须使用override修饰符,以及重写父类属性也必须使用override修饰符. 只有主构造函数才可以往基类的构 ...

  10. 用margin实现两列布局中的自适应列

    <div id="wrapper"> <div id="col1"> "fixed" </div> &l ...