一、RDD 转换算子分类:根据数据处理方式,RDD 算子分为 Value 类型、双 Value 类型和 Key - Value 类型。
1.Value 类型算子
map:逐条映射转换数据,可改变数据类型或值
mapPartitions:以分区为单位处理数据,可进行任意操作,能增删数据,但可能占用大量内存,内存有限时不推荐使用。与 map 相比,map 是分区内串行处理数据,mapPartitions 是分区批处理。
mapPartitionsWithIndex:类似 mapPartitions,处理数据时可获取当前分区索引。
flatMap:先扁平化数据再映射处理,区别于 map 将每条输入数据映射为一个新对象,flatMap 会将输入对象映射为新集合并连接成大集合。
glom:把同一分区数据转换为内存数组,分区不变。
groupBy:按指定规则分组数据,会打乱重组数据(shuffle),可能导致数据倾斜。
filter:筛选过滤数据,保留符合规则的,丢弃不符合的,可能造成分区内数据不均衡。
sample:按规则抽取数据,分不放回(伯努利算法)和放回(泊松算法)两种方式。
distinct:去除数据集中重复数据,可指定分区数。
coalesce:根据数据量缩减分区,提升小数据集执行效率,减少任务调度成本。
repartition:内部执行 coalesce 操作,默认 shuffle 为 true,可实现分区数增减。
sortBy:排序数据,可先处理数据再按处理结果排序,默认升序,会发生 shuffle,新 RDD 分区数与原 RDD 一致。
2.双 Value 类型算子
intersection:求两个 RDD 的交集。
union:求两个 RDD 的并集,重复数据不会去重。
subtract:以源 RDD 元素为主,去除重复元素,保留源 RDD 其他元素(求差集)。
zip:将两个 RDD 元素以键值对形式合并,Key 为第一个 RDD 元素,Value 为第二个 RDD 相同位置元素。
3.Key - Value 类型算子
partitionBy:按指定 Partitioner 重新分区,Spark 默认分区器是 HashPartitioner。
groupByKey:根据 key 对 value 进行分组,存在 shuffle 操作,但无预聚合功能。
reduceByKey:按相同 Key 聚合 Value,可在 shuffle 前预聚合,减少落盘数据量,性能优于 groupByKey ,兼具分组和聚合功能。
aggregateByKey:按不同规则进行分区内和分区间计算。
foldByKey:当分区内和分区间计算规则相同时,是 aggregateByKey 的简化版。
combineByKey:通用的对 key - value 型 rdd 进行聚集操作的函数,可让第一个数据转换结构,分区内和分区间计算规则不同。
sortByKey:对 (K, V) 的 RDD 按 key 排序,K 需实现 Ordered 接口。
join:连接两个 (K, V) 和 (K, W) 类型的 RDD,返回相同 key 对应的元素连接在一起的 (K, (V, W)) 的 RDD
leftOuterJoin:类似 SQL 左外连接。
cogroup:在 (K, V) 和 (K, W) 类型的 RDD 上调用,返回 (K, (Iterable<V>, Iterable<W>)) 类型的 RDD