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. 自己用的jquery经常用的工具command
  2. 攻城狮在路上(叁)Linux(十五)--- 文件与目录的默认权限与隐藏权限
  3. 寻找最合适的view
  4. OC-之NSDate、万年历
  5. CentOS/RHEL 7中的firewall控制
  6. LPC1768定时器普通定时
  7. JVM 堆和栈的区别
  8. Chatbot思考录
  9. 【Java进阶】并发编程
  10. 浅谈AndroidGPU过度绘制、GPU呈现模式分析及相关优化
  11. hive 函数 nvl()
  12. php分割中文字符串为数组的简单例子
  13. Intel HD Graphics 620 (华硕FL5900U) Windows7下安装显卡驱动
  14. bootstrap学习一
  15. mongodb 备份
  16. 2d游戏和 3d游戏的区别
  17. Ajax的XMLHttpRequest对象的属性和方法总结
  18. sqlserver、mysql怎样获取连接字符串
  19. Hibernate双向一对多、双向多对多关联关系中的映射文件怎么写
  20. 描述J2EE框架的多层结构,并简要说明各层的作用。

热门文章

  1. position和float小结
  2. SpringCloud之网关 Zuul(四)
  3. MSSQL 2008 密钥
  4. PyQt5学习笔记14----初识pyqt多线程操作
  5. P1072Hankson的趣味题
  6. [UE4]Visiblity、Render Opacity
  7. [UE4]Math Expression计算数学公式,可以接受参数
  8. vue 绑定属性 绑定Class 绑定style
  9. SerializeHelper
  10. php namespace use 研究