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))

最新文章

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

热门文章

  1. 恢复word中审阅选项卡
  2. 关键两招就解决Wampserver 打开localhost显示IIS7图片问题
  3. 使用socket.io client 开发时兼容IE低版本的办法
  4. bzoj4941: [Ynoi2016]镜子里的昆虫
  5. asp.net利用HttpModule实现防sql注入和加载样式和JS文件
  6. flume http source示例讲解
  7. div+css命名大全
  8. 如何获取阿里云OSS上每个文件夹的大小
  9. SAS DATA ENCODING 解决odbc乱码问题
  10. scala使用hbase新api