Spark学习_5(常用RDD学习_下)

combineByKey

combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner,maoSideCombine)
createCombiner:在第一次遇到key时创建组合器函数,将RDD数据集中的V类型转换成C类型(V=>C);
mergeValue:合并值函数,同时在遇到相同的Key时,createCombiner的C类型与这次传入的V类型值合并成一个C类型值(C,V)=>C
mergeCombiner:合并组合器函数,将C类型值两两合并成一个C类型的值
partitioner:使用已有的或者自定义的分区函数,默认HashPartition
mapSideCombine:是否在map端进行Combine操作,默认为true

简单实例1:

一些销售数据,以<公司,当月收入>的形式保存,通过combineByKey的操作求出每个公司的总收入和月平均收入

val data=sc.parallelize(Array(("company_1",20),("company_2",16),("company_4",28),("company_3",45),("company_2",20),("company_1",28),("company_3",20),("company_4",20)))
val res=data.combineByKey((income)=>(income,1),(acc:(Int,Int),income)=>(acc._1+income,acc._2+1),(acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)).map({case(key,value)=>(key,value._1,value._1/value._2.toFloat)})

执行data.combineByKey时,首先,取出data中的第一个RDD元素,(“company_1”,20)
key是company_1,这个key第一次遇到,因此Spark会为这个key创建一个组合器函数 createCombiner,负责把Value从V类型转化成C类型,这里createCombiner的值是一 个匿名函数,即(income)=>(income,1),系统会把company_1这个key对应的value赋值 给income,也就是income=20.然后将income转换成一个元组(income,1)。然后是第二个rdd元素(“company_2”,16),也是为这个新的key创建一个createCombiner.当遇到相同key时,系统会根据mergeValue所提供的合并值函数,将createCombiner的C类型值和这次传入的V类型值合并成一个新的C类型值。即(acc:(Int,Int),income)=>(acc._1+income,acc._2+1),例如当(“company_1”,28)被传入时,系统会把28这个值赋值给income,把以前得到的(20,1)这个类型赋值给acc。acc._1+income就是20+28,acc._2+1就是将原来(20,1)中的1再加上1.从而得到(48,2)。
由于RDD被分成了多个分区,实际应用中分区可能再不同的机器上,因此需要mergeCombiners对不同机器上的结果进行汇总。这里(acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+
acc2._1,acc1._2+acc2._2)),是将两个C类型进行合并,得到一个新的C类型。map({case(key,value)=>(key,value._1,value._1/value._2.toFloat)})是指求出每个公司的总收入和平均收入。
输入给map的每个RDD类似于(“company_1”,(48,2))这种形式
实验结果如下:
在这里插入图片描述

简单实例:

给定一组键值对(“spark”,2),(“hadoop”,6),(“hadoop”,4),(“spark”,6),key表示图书名,value表示平均销量,求出每种图书每天平均销量
运行语句如下:

val rdd=sc.parallelize(Array(("spark",2),("spark",2),("hadoop",2),("hadoop",6),("hadoop",4),("spark",6)))
rdd.mapValues(x=>(x,1)).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).mapValues(x=>(x._1/x._2)).collect()

解析:通过mapValues(x=>(x,1))会把rdd中每一个元素都取出来,并把该元素中的value转化成一个元组(x,1),例如(“spark”,2)中value值2转化为(2,1),因而此时rdd存储的数据变成了(“spark”,(2,1))。
reduceByKey((x,y)=>(x._1+y._1,x._2+y._2))会把相同key值的value进行聚合计算。 mapValues(x=>(x._1/x._2))对rdd中的每个元素的value执行变化。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值