Spark算子介绍和比较

转换算子

1)map(func):返回一个新的 RDD,该 RDD 由每一个输入元素经过 func 函数转换后组成.

2)mapPartitions(func):类似于 map,但独立地在 RDD 的每一个分片上运行,因此在类型为 T 的 RD 上运行时,

func 的函数类型必须是 Iterator[T] => Iterator[U]。假设有 N 个元素,有 M 个分区,那么 map 的函数的将被调用 N

次,而 mapPartitions 被调用 M 次,一个函数一次处理所有分区。

3)mapPartitionsWithIndex(Int,Iterator)

​ 将待处理的数据以分区为单位发送到计算节点进行处理,这里的处理是指可以进行任意的处理,哪怕是过滤数据,在处理时同时可以获取当前分区索引。(对某个分区中的数据做操作,也即可以对不同的分区做不同的处理)

4)flatmap

​ 将处理的数据进行映射处理后再进行扁平化处理,输出的是一整个集合,再封装为RDD,所以算子也称之为扁平映射;和Map函数的主要区别在于flatmap还有一个扁平化过程;

5)glom()

不传参数

作用和flatmap相反,将同一个分区的数据直接转换为相同类型的内存数组进行处理,分区不变(分区不变指的是变换前后分区数和数据所在分区位置都不变),比如变换前数据为【1,2】,【3,4】,变化规则为集合内数据乘以2;则变换后数据为【2,4】,【6,8】,分区未发生改变;比如把Int类型的数据合并成一个一个的数组;

6)filter(func) : RDD[T]

➢ 函数说明

​ 将数据根据指定的规则进行筛选过滤,符合规则的数据保留,不符合规则的数据丢弃。当数据进行筛选过滤后,分区不变,但是分区内的数据可能不均衡,生产环境下,可能会出现数据倾斜

7)distinct()不加参数

➢ 函数说明

将数据集中重复的数据去重

8)coalesce(numPartitions: Int, shuffle: Boolean = false):RDD[T]

参数:(numPartitions: Int, shuffle: Boolean = false)

第一个参数:合并后的分区数;

第二个参数:是否进行shuffle(打乱重新组合)处理,使得数据更加均衡;

字面意思:合并;结合;联合

➢ 函数说明

​ 根据数据量缩减分区,用于大数据集过滤后,提高小数据集的执行效率;当 spark 程序中,存在过多的小任务的时候,可以通过 coalesce 方法,收缩合并分区,减少分区的个数,减小任务调度成本

可以选择是否开启shuffle;不开启容易发生数据倾斜问题;

9)双Value类型(交集、并集、差集、拉链)

intersection(RDD[T])

➢ 函数说明

​ 对源 RDD 和参数 RDD 求交集后返回一个新的 RDD

union(RDD[T])

➢ 函数说明

​ 对源 RDD 和参数 RDD 求并集后返回一个新的 RDD

subtract(RDD[T])

➢ 函数说明

​ 以一个 RDD 元素为主,去除两个 RDD 中重复元素,将其他元素保留下来。求差集

zip(RDD[T])

➢ 函数说明

​ 将两个 RDD 中的元素,以键值对的形式进行合并。其中,键值对中的 Key 为第 1 个 RDD中的元素,Value 为第 2 个 RDD 中的相同位置的元素**(拉链)**

10)groupBy(func): RDD[(K, Iterable[T])]

➢ 函数说明

​ 将数据根据指定的规则进行分组, 分区数默认不变,但是数据会被打乱重新组合,我们将这样的操作称之为 shuffle。极限情况下,数据可能被分在同一个分区中(一个组的数据在同一分区中,但同一分区中不是一定只有一个组

11)sortBy(f: (T) => K,ascending: Boolean = true)

前后分区数不变:numPartitions: Int = this.partitions.length

➢ 函数说明

​ 该操作用于排序数据。在排序之前,可以将数据通过 f 函数进行处理,之后按照 f 函数处理的结果进行排序,默认为升序排列。排序后新产生的 RDD 的分区数与原 RDD 的分区数一致。中间存在 shuffle 的过程

12)partitionBy(partitioner: Partitioner)

➢ 函数说明

​ 将数据按照指定 Partitioner 重新进行分区。Spark 默认的分区器是 HashPartitioner(numPartitions)如果是自定义的分区器,则参数中应该是自定义的分区器的实例对象;

​ 只有 Key-Value 类型的 RDD 才有分区器,要重写继承类Partitioner中的getPartition方法,而getPartition方法的参数为数据的key;

13)reduceByKey(func)、reduceByKey(func,numPartitions:Int)

注意:这里的func是对value进行操作,key不需要操作(两两聚合);

如果有的key只有一个value,则不会参与计算,直接输出即可;

➢ 函数说明

​ 可以将数据按照相同的 Key 对 Value 进行聚合

14)groupByKey()、groupByKey(numPartitions:Int)、groupByKey(partitioner:Partitioner)

➢ 函数说明

​ 将数据源的数据根据 key 对 value 进行分组

与groupBy不同,groupByKey函数是对value按照key进行分组,输出的值只有value的分组,而groupBy输出的是整体结果的分组;

15)aggregateByKey(zeroValue: U)(seqOp: (U, V)

// aggregateByKey存在函数柯里化,有两个参数列表
// 第一个参数列表,需要传递一个参数,表示为初始值
//       主要用于当碰见第一个key的时候,和value进行分区内计算
// 第二个参数列表需要传递2个参数
//      第一个参数表示分区内计算规则
//      第二个参数表示分区间计算规则

➢ 函数说明

​ 将数据根据不同的规则进行分区内计算和分区间计算

16)foldByKey(zeroValue: V)(func: (V, V) => V)

➢ 函数说明

​ 当分区内计算规则和分区间计算规则相同时,aggregateByKey 就可以简化为 foldByKey

17)combineByKey(createCombiner: V => C,mergeValue: (C, V) => C,mergeCombiners: (C, C) => C)

与aggragateByKey进行比较;

参数说明:

第一个参数:将相同key的第一个数据进行结构的转换,实现操作(类似与aggregateByKey的第一步操作结束时的状态)

第二个参数:分区内的计算规则

第三个参数:分区间的计算规则

➢ 函数说明

​ 最通用的对 key-value 型 rdd 进行聚集操作的聚集函数(aggregation function)。类似于aggregate(),combineByKey()允许用户返回值的类型与输入不一致、

18)combineByKey(createCombiner: V => C,mergeValue: (C, V) => C,mergeCombiners: (C, C) => C)

与aggragateByKey进行比较;

参数说明:

第一个参数:将相同key的第一个数据进行结构的转换,实现操作(类似与aggregateByKey的第一步操作结束时的状态)

第二个参数:分区内的计算规则

第三个参数:分区间的计算规则

➢ 函数说明

​ 最通用的对 key-value 型 rdd 进行聚集操作的聚集函数(aggregation function)。类似于aggregate(),combineByKey()允许用户返回值的类型与输入不一致

19)sortByKey(ascending: Boolean = true)

numPartitions: Int = self.partitions.length 排序前后分区数不变;

➢ 函数说明

​ 在一个(K,V)的 RDD 上调用,K 必须实现 Ordered 接口(特质),返回一个按照 key 进行排序的

20)cogroup(other: RDD[(K, W)])

➢ 函数说明

​ 概念理解:connect + group

​ 在类型为(K,V)和(K,W)的 RDD 上调用,返回一个(K,(Iterable,Iterable))类型的 RDD;把相同的key放在同一个组当中并连接在一起;

reduceByKey、foldByKey、aggregateByKey、combineByKey 的区别?

reduceByKey: 相同 key 的第一个数据不单独进行任何计算,如果只有一个数据直接输出,分区内和分区间计算规则相同

aggregateByKey:相同 key 的第一个数据和初始值进行分区内计算,分区内和分区间计算规则不一定相同

FoldByKey: 相同 key 的第一个数据和初始值进行分区内计算,分区内和分区间计算规则相同

combineByKey ::当计算时,发现数据结构不满足要求时,可以让第一个数据转换结构,分区内和分区间计算规则不一定相同

reduceByKey和groupByKey的区别?

reduceByKey:按照 key 进行聚合,在 shuffle 之前有 combine(预聚合)操作,返回结果是 RDD[k,v]。

groupByKey:按照 key 进行分组,直接进行 shuffle。

但是注意,reduceByKey的聚合不能影响最终结果;

Spark的action算子

1)reduce(reduceFunction) 先进行分区内聚合、在进行分区间聚合;

2)collect() 以数组Array形式返回数据集的所有元素

3)count() 统计数据集的元素个数

4)first() 返回数据集的第一个元素

5)take(n) 获取数据集中的n个元素,以Array数组形式返回

6)foreach(Function) 随机抽取数据集内元素做遍历计算;

7)saveAs…File(path)(比如TextFile) 保存数据集为特定格式文件;

8)aggregate(a)(function1,function2)、fold(a)(function)聚合计算

9)countByKey()以Map结构返回相同key的统计数目;

会引起Shuffle过程的spark算子

1、repartition类的操作:比如repartition、repartitionAndSortWithinPartitions、coalesce等
2、byKey类的操作:比如reduceByKey、groupByKey、sortByKey、combineByKey、aggregateByKey、foldByKey、countByKey(行动算子,其他都是转换算子)等
3、join类的操作:比如join、cogroup等

reduceByKey、groupByKey、aggregateByKey、foldByKey、sortByKey、combineByKey;

上一篇:SparkMlib基础和基础统计


下一篇:SparkMLlib的线性回归和逻辑回归