开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:Rdd 算子_转换_groupbykey】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11972
Rdd 算子_转换_groupbykey
内容介绍:
一、序言
二、group by key的原理
三、group by key 的使用
四、Reduce by key 能不能在 map 端做 combiner
一、序言
在前面的学习中,了解到一个算子,是一个聚合操作,就是 reduce by key,它的作用是按照 key 来进行聚合,根据key 来进行分组,然后再把每一组数据进行 reduce 操作,就得到 reduce by key。Reduce by key本质上还是一个reduce 操作,但如果我只是想进行分组的话,是不合适。如果只进行分组操作,这是就需要用到 group by key,这个算子就是按照 key 来进行分组即 group。
二、group by key的原理
如下图所示:
首先最根本上来讲 group 它也是一个 sheffeld 操作,因为上面有一个 a,1这样的一个元素,也是一个 key value,那在第二部分有一个 a,1的部分。
那么他们俩的 key 是否一样?但是他俩的分区不一样,所以这两个数据要发往同一个 reduce 的分区,这个时候就看到两个一样的 key,最终生成了一个结果,结果当中 value 的位置是一个数组,那么这个数组里面是两个元素各自动使用,那这就是 group by key 的原理,那至少它是一个是 sheffeled。还有一个特点是,如果后面带的是 by key 那么后面只能处理 key value 的数据。
三、group by key 的使用
进入到 IDEA 中,如何实现该方法。先拷贝集合的定义,有了集合之后,直接进行 group by key 操作,group by key不需要接受 function 函数,因为 group by key 是一个 group 操作,按照 key 来进行 group 操作,接下里进行收集结果。
@Test
def groupByKey():Unit =(
sc.parallelize(Seq(("a",1),("a",1)
,("b",1)))·groupByKey()
.collect()
.foreach(item => println((item)
)
运行结果如下:
后面生成了一个类似于数组的东西,里面放置了俩个 key 为 a 的所有值。group by key 的结果形式首先还是一个元祖,元组的第一个位置还是 key,第二个位置是一个 compact,类似于集合,用集合来表示(K(value1)(value2))
四、Reduce by key 能不能在 map 端做 combiner
1.能不能减少 io?Combiner 最根本的意义是为了减少 io,reduce by key 一个分区只有一条数据,和出来一个分区出来,显然是后者数据更多,所以 Reduce by key 在 map 做 combiner 有意义的,但 group by key 在 map 段做combiner 是无意义的。因为要进行的是 group 操作,那么在 map 端,进行 combiner 之后,这些数据还要返回来,减少的 io 很少。
reduce by key 和 group by key 有很大区别就是 reduce by key 在 map 段有 combiner,group by key 在 map 段没有 combiner。