天天看点

spark大数据分析:spark core(4) 转换算子

partitionBy

reduceByKey

groupByKey

combineByKey

aggregateByKey

foldByKey

sortByKey

join

cogroup

mapValues

flatMapValues

map

flatMap

filter

distinct

mapPartition

mapPartitionWithIndex

union

insertsection

subtract

coalesce

repartition

randomSplit

glom

zip

zipPartitions

zipWithIndex

zipWithUniqueld

sortBy

基础转换

键值对转换

源码

一进一出

案例

基于map以及reduceByKey的封装,同时重载方法可以修改分区数,默认情况下distinct和原分区数一致

与map不同的是,某个RDD有2个分区,10个元素,那么map是将元素直接依次应用到f函数上,而mapPartition操作中则是先遍历分区,再遍历分区中的元素,第一个参数是迭代器,第二个参数是是否保留分区信息,默认是false,除非上游是简直对且函数对key进行修改,否则保留分区信息无意义

与mapPartition 不同,输出结果带分区号

返回数据并集

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100

不会对数据去重

返回数据交集

15,16,17,18,19,20

返回数据差集

12,1,13,2,14,3,4,5,6,7,8,9,10,11

减少分区

第二个参数默认是false,如果目标分区数大于原始分区,此操作无意义,维持原分区不变,对于较多分区向较少分区转换,coalesce 不会产生shuffle,而向多分区转换类比 repartition

其实底层是 coalesce 但是shuffle 参数是true,所以无论是多分区向少分区转换还是少分区向多分区转换都会产生shuffle,coalesce 开启shuffle 与 repartition 一致

拆分RDD分配权重值

最好是 1,3,4,2 之间加起比例为1 1/10 + 3/10 + 4/10 + 2/10 = 1

每个RDD 中元素个数近似为权值

将RDD中每个分区变成一个数组,放置在新的RDD中

将两个RDD以键值对方式进行合并,key为EDD第一个元素,value为RDD 第二个元素

如果两个RDD分区数不一致,报错

将两个RDD按照分区号进行合并

将RDD中元素与该RDD 索引进行合并

该元素与元素的唯一id对应

id生成算法

xn +k

n分区数,k 分区号,x 自然数 从0开始

排序,默认升序

重分区生成shuffleRDD

对于RDD中相同的K和V的值进行聚合

设置RDD分区数,指定分区数个数

(aads,321) (zs,45)

createCombiner:

该参数是一个操作,当遍历RDD中每一个元素,如果该元素对于的K是被第一次访问,则会调用createCombiner操作来创建组合器从而将元素的值从V类转换为C类

mergeValue

将 C 类型和V 类型转换为C类型

combineByKeyWithClassTag

一个RDD 有多个分区,多个拥有相同的k 可以被分散到不同的分区中,每个分区有独立的Combiner,拥有相同的键的元素会先在各个所在分区进行聚合,然后通过 mergeCombiners 函数将多个分区中的函数将多个分区各自的聚合结果按照键做最后一次聚合
(zs,12.0),(aads,277.0)

zeroValue

设置聚合时的初始值,可以是数字或者集合

seqOp

将值V聚合到类型为U的对象中

combOp

跨分区聚合,对数据进行最终的汇总时调用此操作

原理与combineByKey相同,是对combinerByKey的封装,简化了操作 aggregateByKey

和reduceBykey雷同,但是接受传入初始值根据key聚合

zeroValue 为初始值

结果

(zs,2122)->(aads,2321f233f)

aggregateByKey , foldByKey , reduceByKey 三个操作本质都是调用combineByKey

combineByKey 和 aggregateByKey 输入输出类型可以不一致,但是 foldByKey 与 reduceByKey 输入输出类型必须一致

根据key排序,可以选择倒序或者正序

(aads,321f),(aads,233f),(zs,1),(zs,2)

相同的key的值聚合在一起构成一个集合,不同的舍弃

代码

(zs,(1,2)),(zs,(2,2)),(aads,(321f,233f)),(aads,(233f,233f))

相当于求并集

(aads2,(CompactBuffer(),CompactBuffer(321f))),(zs,(CompactBuffer(1, 2),CompactBuffer(2))),(zs1,(CompactBuffer(),CompactBuffer(1))),(aads,(CompactBuffer(321f, 233f),CompactBuffer(233f)))

对v进行操作,返回新的RDD

(zs,1 元),(zs,2 元),(aads,321f 元),(aads,233f 元)
(zs,1),(zs,),(zs,2),(zs, ),(zs,元),(zs,2),(zs,),(zs,3),(zs, ),(zs,元),(aads,3),(aads,2),(aads,1),(aads,f),(aads,),(aads,4),(aads, ),(aads,元),(aads,2),(aads,3),(aads,3),(aads,f),(aads, ),(aads,元)

继续阅读