Spark Operator
区分 RDD 的方法和 Scala 集合对象的方法
- Scala 集合对象的方法在同一个节点的内存中完成
- RDD 的方法可以将计算逻辑发送到 Executor 端执行
Transformation
- map
- mapPartitions
- 映射函数的参数从 RDD 中的每一行元素变成 RDD 中每一个分区的迭代器
- 一次函数调用会处理一个 partition 所有数据
- 内存不够,可能会导致 OOM。
- 解决映射过程中需要频繁创建额外的对象
- mapPartitionsWithIndex
- 多增加一个分区索引
- sample
- flatMap 先映射,再扁平化
- filter
- union 求并集
- 多个 RDD 合并
1 | rdd1 = sc.parallelize([1, 2, 3]) |
- intersection 交叉口,求交集
- distinct
- groupby
- 按 key 分组,value 合并(能相加就相加,不能加成为一个数组)
- groupByKey
- reduceByKey
- 和 ((2b067530-16d4-428c-a3f7-d264ab7e68ed)) 的区别?
- reduceByKey 会先在 map 端聚合,减少 reduce 端压力
- 有时候使用 groupByKey 执行时间长,极易发生内存溢出
- 如果 key 非常少,value 非常多,reduceByKey 会触发 shuffle 操作,可以先对数据进行一次 repartition
- 和 ((2b067530-16d4-428c-a3f7-d264ab7e68ed)) 的区别?
- aggregateByKey
- sortByKey
- repartition
- 实现原理
coalesce(numPartitions, shuffle = true) - 默认对数据进行 [[Spark Shuffle]]
- 实现原理
- partitionBy
- 针对
RDD[(K, V)] - 按指定规则对数据进行重新分区
- 默认分区器
HashPartitioner
- 默认分区器
- 针对
- repartitionAndSortWithinPartitions(partitioner: Partitioner)
- 针对 repartition 重分区后进行排序的场景
- 针对
RDD[(K, V)] - 传入 partitioner 分区
- 对数据进行排序
- 连接
- join
- leftOuterJoin()
- rightOuterJoin()
- join
- cogroup
- cartesian
- pipe
- coalesce
rdd.coalesce(numPartitions = 2, shuffle=false)- 调整 RDD 分区数量
- 收缩合并分区,减少任务调度成本
- 使用 coalesce 增加分区必定会导致数据倾斜
- 为什么使用 coalesce 合并分区后会导致数据倾斜?#card
- coalesce 没有对数据进行 [[Spark Shuffle]],原来属于同一分区的数据会同时进入一个新的分区
- cache
Action:遇到一个 action 算子,提交一个 job
- reduce
- collect
- show
- first
- take 取前几条记录
- takeSmaple
- takeOrdered 返回前 n 个元素,并按默认顺序排序。
- count
- countByKey
- foreach
- lookup 返回给定 key 对应的所有值
- saveAsTextFile
- saveAsSequenceFile
- saveAsObjectFile
- collectAsMap kypairs 以 map 形式保存到 driver 上,注意可能会超过 driver 的内存上限
KeyBy:指定 key,将 RDD 变成 key-value 格式
网络回响
Spark Operator