转换算子
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;