spark中对key进行操作的算子

groupByKey([numTasks]) : 在一个PairRDD或(k,v)RDD上调用,返回一个(k,Iterable)。主要作用是将key相同的值分组到一个集合序列当中,其中顺序不确定。
由于groupByKey会把所有的键值对都加载到内存中进行计算,并且不会进行map端聚合,在正式生产环境中,如果一个键值对对应的数据过多,可能会造成内存溢出。

val arr = Array((1,1),(4,2),(1,2),(5,5),(1,4),(4,5))
val data = sc.parallelize(arr,2)
val groupRes = data.groupByKey(2)
groupRes.foreach(x=>print(x))
结果:(4,CompactBuffer(2, 5))(1,CompactBuffer(1, 2, 4))(5,CompactBuffer(5))

reduceByKey(func, [numTasks]) : 在 (K, V) 类型的RDD上调用,返回一个(K, V)类型的RDD,其中 values 是针对每个 key 使用给定的函数 func 来进行聚合的,所以 values 必须是 type (V,V) => V 的类型
reduceByKey和groupByKey类似但有不同,reduceByKey主要作用是对key进行func函数的聚合,groupByKey主要是对key进行分组;同时reduceByKey会在map端先对数据进行聚合一次,这样就能减少reduceTask从map端拉取数据的数据量

val reduceByKeyRes = data.reduceByKey(+)
reduceByKeyRes.foreach(x=> print(x))
结果 : (1,7)(4,7)(5,5)

reduceByKey和groupByKey的区别:
在这里插入图片描述

aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) : 在 (K, V)类型的RDD上调用时,返回 (K, U)类型的RDD。
zeroValue 代表每个分区中所有(k,v)的初始值,seqOp代表每个map端的聚合逻辑,combOp代表reduce端的逻辑

def seqFunc(a:Int,b:Int):Int={
math.max(a,b)
}
def combFunc(x:Int,y:Int):Int = {
(x+y)
}
val res = data.aggregateByKey(3)(seqFunc,combFunc)
//val res1 = data.aggregateByKey(3)(math.max(,),+)
res.foreach(x => print(x))
结果 : (1,7)(4,8)(5,5)

详细过程:
说明:在这里插入图片描述
注意:在进行seqFunc逻辑处理的时候,每个分区内都会进行同样的逻辑,所以要区分只有一个分区和多个分区的情况

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值