Spark map&mapPartition的区别
1. map
对RDD的每个元素应用一个函数
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
// 清理闭包中不能序列化的变量
val cleanF: T => U = sc.clean(f)
// (TaskContext, partition index, iterator)
// 分区处理,每个分区的数据在一个迭代器中,这个迭代器调用map方法对每个数据按照传入的方法进行处理
// 最后返回一个新的RDD MapPartitionsRDD继承自RDD
new MapPartitionsRDD[U, T](this, (context, pid, iter) =>
iter.map(cleanF)
)
}
2.mapPartition
对RDD的每个分区应用一个函数:
- 一个task只会执行一次function
- 一个partition数据量过多的话,可能导致OOM
def mapPartitions[U: ClassTag](
f: Iterator[T] => Iterator[U],
preservesPartitioning: Boolean = false): RDD[U] = withScope {
val cleanedF: Iterator[T] => Iterator[U] = sc.clean(f)
new MapPartitionsRDD(
this,
(context: TaskContext, index: Int, iter: Iterator[T]) => cleanedF(iter),
preservesPartitioning)
}