Spark聚合操作:combineByKey()
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))
详解:
统计得到的结果:得到姓名:科目+总分
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()的更多相关文章
- Spark GraphX 聚合操作
package Spark_GraphX import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.graph ...
- Spark RDD 操作
1. Spark RDD 创建操作 1.1 数据集合 parallelize 可以创建一个能够并行操作的RDD.其函数定义如下: ) scala> sc.defaultParallelism ...
- spark中的combineByKey函数的用法
一.函数的源码 /** * Simplified version of combineByKeyWithClassTag that hash-partitions the resulting RDD ...
- Update(Stage4):sparksql:第3节 Dataset (DataFrame) 的基础操作 & 第4节 SparkSQL_聚合操作_连接操作
8. Dataset (DataFrame) 的基础操作 8.1. 有类型操作 8.2. 无类型转换 8.5. Column 对象 9. 缺失值处理 10. 聚合 11. 连接 8. Dataset ...
- 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9 关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...
- MongoDB 聚合操作
在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...
- .NET LINQ 聚合操作
聚合操作 聚合运算从值集合计算单个值. 从一个月的日温度值计算日平均温度就是聚合运算的一个示例. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 ...
- Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)
在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...
- OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念
先看下 http://www.cnblogs.com/bonelee/p/6236962.html 这里对于环形数据库的介绍,便于理解归档这个操作! 转自:http://blog.sina.com.c ...
随机推荐
- 4-4 R语言函数 tapply
#对向量的子集进行操作 #tapply(参数):tapply(向量,因子/因子列表,函数/函数名) > x <- c(rnorm(5),runif(5),rnorm(5,1)) > ...
- 企业案例 【故障修复】mysql主从故障解决过程
由于配置有zabbix监控,某日收到zabbix监控主从报警,,查看mysql状态, showslave status \G; slave复制状态有误,SLAVE_SQL_RUNNING为NO, 接着 ...
- C#根据淘宝接口网址获取客户端访问IP和网络运营商
网络运营商会为每台联网的电脑分配公网IP,如何获取它们?? 话不多说直接上代码: using System; using System.Collections.Generic; using Syste ...
- RadioButtonFor值为false.默认选中的问题
(自己看了下.图片有点宽.显示的不全.可以右键新标签查看) 作为一个新手.今天又开始了mvc的学习之旅.然而学习过程中又遇到了一个奇妙的问题.... 一切按部就班到了这里.注册界面. 一眼看上去就不对 ...
- boost::bind 学习
最近学习了太多与MacOS与Iphone相关的东西,因为不会有太多人有兴趣,学习的平台又是MacOS,不太喜欢MacOS下的输入法,所以写下来的东西少了很多. 等我学习的东西慢慢的与平台无关的时 ...
- python执行时遇到 KeyError: b'somevar' 时需要想到的
虽然这个问题很小,但我觉得很有必要单独拿出来强调一下. 这样在遇到类似错误的时候可以很快反应过来,进而节约了时间. 这里我拿 shelve 模块举例(shelve的作用大致就是把python变量存放到 ...
- 使用CBrother做TCP服务器与C++客户端通信
使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之 ...
- IIS中多域名多网站的设置方法
一个 IP 可以绑定多个域名.如您需要实现多个域名访问同一个网站,只需就不同域名添加 A 记录指向同一个 IP 即可. 如您需要实现多个域名访问同一虚拟服务器上不同网站,也需要就不同域名添加 A 记录 ...
- 2017-2018-2 20155315《网络对抗技术》Exp4:恶意代码分析
实验目的 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systracer套件 ...
- JAVA Swing开发单机版项目
一.序 最近公司做的项目里出现了一个新的需求,项目大部分是为金融业定制开发的数据集成平台,包括数据的采集,处理,使用. 数据的采集方式不固定,有机构化数据,有非结构话数据,还有附件等其它文件形式. 对 ...