键值对操作 之 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))
最新文章
- [深度学习大讲堂]从NNVM看2016年深度学习框架发展趋势
- Linux 下比较文件内容并相同部分、不同部分
- 每天一个 Linux 命令(5):rm 命令
- LoadRunner 文本检查点使用
- windows7环境下svn服务器的配置及使用
- C#之面向对象初步
- LA 3641 (置换 循环的分解) Leonardo&#39;s Notebook
- [OC Foundation框架 - 18] Class
- ecshop后台管理显示扩展分类
- Dynamics CRM2013 编辑视图时弹出尚未保存所做的更改警示框
- Java 在PDF 中添加超链接
- HDU1166-ZKW树
- 圆形图片 ImageView
- 第57节:Java中流的操作以及编码解码
- 尚硅谷springboot学习29-docker常用命令和操作
- Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法
- <;<;APUE>;>; 编译方法
- 当你的静态资源CDN挂掉了该怎么办?
- 如何判断html页面停止滚动?
- eclipse查看源代码问题