当前位置:   article > 正文

spark中对key进行操作的算子_spark的key算子

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逻辑处理的时候,每个分区内都会进行同样的逻辑,所以要区分只有一个分区和多个分区的情况

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/655873
推荐阅读
相关标签
  

闽ICP备14008679号