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)
}
Spark的map操作应用于RDD的每个元素,而mapPartitions则作用于每个分区,处理整个分区的数据。map在每个元素上应用函数,而mapPartitions使用迭代器处理分区内容,可能涉及更复杂的逻辑。如果一个分区数据过大,mapPartitions可能会导致内存溢出(OOM)。两者都通过clean方法清理闭包中的非序列化变量。
1242

被折叠的 条评论
为什么被折叠?



