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
和 groupByKey
的区别?reduceByKey 会先在 map 端聚合,减少 reduce 端压力
有时候使用 groupByKey 执行时间长,极易发生内存溢出
如果 key 非常少,value 非常多,reduceByKey 会触发 shuffle 操作,可以先对数据进行一次 repartition
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 格式