键值对操作 之 combineByKey
combineByKey( createCombiner,mergeValue,mergeCombiners,partitioner)
combineByKey() 是最为常用的基于键进行聚合的函数。大多数基于键聚合的函数都是用它实现的,如 groupByKey,reduceByKey等等。和aggregate() 一样,combineByKey() 可以让用户返回与输入数据的类型不同的返回值。要理解combineByKey(), 要先理解它在处理数据时是如何处理每个元素的。由于combineByKey() 会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就和之前的某个元素的键相同。如果这是一个新的元素,combineByKey() 会使用一个叫作createCombiner() 的函数来创建那个键对应的累加器的初始值。需要注意是,这一过程会在每个分区中第一次出现各个键时发生,而不是在整个RDD 中第一次出现一个键时发生。如果这是一个在处理当前分区之前已经遇到的键,它会使用mergeValue() 方法将该键的累加器对应的当前值与这个新的值进行合并。由于每个分区都是独立处理的,因此对于同一个键可以有多个累加器。如果有两个或者更多的分区都有对应同一个键的累加器,就需要使用用户提供的mergeCombiners() 方法将各个分区的结果进行合并。
createCombiner :用于将RDD[K,V]中的V转换成一个新的值C1
mergeValue:将一个C1类型值和一个V类型值合并成一个C2类型,输入参数为(C1,V),输出为新的C2
mergeValue:用于将两个C2类型值合并成一个C3类型,输入参数为(C2,C2),输出为新的C3
如例:键值对求平均值
scala> val parrdd=sc.parallelize(List((1,10),(1,30),(2,50),(3,20),(2,80),(5,10)))
parrdd: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[0] at parallelize at <console>:24
scala> parrdd.combineByKey((value)=>(value,1),(acc:(Int,Int),v)=>(acc._1+v,acc._2+1),(acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)).map{case(k,v)=>(k,v._1/v._2)}.collect()
res10: Array[(Int, Int)] = Array((1,20), (5,10), (2,65), (3,20))
scala> val numpairdd=sc.makeRDD(Array(("zhangsan",100),("wangwu",250),("xiaoma",120),("laozhan",300),("tiandi",60)),2)
numpairdd: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[26] at makeRDD at <console>:32
---------------------------
scala> aa.collect
res77: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> val mapRDD=aa.map(x=>(TaskContext.getPartitionId,x))
mapRDD: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[109] at map at <console>:28
scala> mapRDD.combineByKey((v:Int)=>v+"_" ,(c:String,v:Int)=>c+"$"+v, (c1:String,c2:String)=>c1+"%"+c2).collect
res78: Array[(Int, String)] = Array((0,1_$2), (1,3_$4$5), (2,6_$7), (3,8_$9$10))
键值对操作 之 combineByKey的更多相关文章
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
- Spark中的键值对操作-scala
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark学习之键值对操作总结
键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...
- Spark学习笔记——键值对操作
键值对 RDD是 Spark 中许多操作所需要的常见数据类型 键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式. Spark 为包 ...
- Spark学习笔记3:键值对操作
键值对RDD通常用来进行聚合计算,Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为pair RDD.pair RDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口. S ...
- 键值对操作 上(Spark自学五)
键值对RDD是Spark中许多操作所需要的常见数据类型. “分区”是用来让我们控制键值对RDD在各节点上分布情况的高级特性.使用可控的分区方式把常在一起被访问的数据放在同一个节点上,可以大大减少应用的 ...
- PHP学习之数组Array操作和键值对操作函数(一)
PHP 中的数组实际上是一个有序映射.映射是一种把 values关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合, ...
- spark入门(三)键值对操作
1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...
随机推荐
- C/C++基础----重载运算与类型转换
非成员版本 data1 + data2: operator+(data1, data2); 成员版本 data1 += data2: data1.operator+=(data2); 不建议的重载 逻 ...
- 记使用vue-awesome-swiper遇到的一些问题
一.vue-awesome-swiper的使用 1.在项目中全局引用 import VueAwesomeSwiper from 'vue-awesome-swiper' // require s ...
- this、apply/call、bind、闭包、函数、变量复制
一.实际场景中抽象出的一个问题 下面this各指向什么? var a = { b: function() { console.log(this); }, f: function() { var c = ...
- uoj#213. 【UNR #1】争夺圣杯
http://uoj.ac/problem/209 单调栈求出每个位置x左边第一个大于它的位置L[x]和右第一个不小于它的位置R[x],于是矩形L[x]<=l<=x<=r<=R ...
- SSH的配置文件
Hibernate: xxx.hbm.xml ,作用:类的属性和表的列建立映射关系,主键策略,多表查询等 hibernate.cfg.xml ,核心配置文件,数据库配置信息,加载xxx.hbm.x ...
- WordPress设置地址的问题
刚刚安装了一个Wordpress,第一次使用,所以对设置不是很熟悉. 在常规设置那里,有两个地址设置,一个是WordPress 地址(URL),另一个是站点地址(URL),刚开始分不清这两个的区别,所 ...
- rsync数据备份
scp远程复制 scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 命令格式: scp local_file remote_username@ ...
- arduino mega 避障报距小车
流程图 硬件 mega2560 // Pin 13 has an LED connected on most Arduino boards. // give it a name: #include&l ...
- [UE4]GameUserSettings
- 第5章 IP地址和子网划分(1)_IP格式和子网掩码
1. 二进制和十进制 (1)二进制与十进制的对应关系 ①128为数轴的中点,最高位为1.其后的数,二进制最高位均为1.其前面的数二进制最高位均为0. ②192为128-255中间的数,最高两位为1.2 ...