有时候觉得会不会从来没看过源码会是种遗憾,尝试着去看spark源码时又发现看不懂……
map和mapValues的区别其实很大,最重要的区别是mapValues只对Tuple2的第二个元素进行操作,保留第一个元素key不变(废话)。先上结论:
- mapValues在不改变数据分区的情况下对数据进行一些转换操作,从而避免在进一步的join/reduce之类的操作中产生不必要的shuffle开销,如果想要制造narrow dependency,这一点还是需要知道;
- map操作过后partitioner会丢失,仿上——join/reduce之类的操作时会产生shuffle
Spark源码中map/mapValues的相关体现://RDD中的partitioner
/** Optionally overridden by subclasses to specify how they are partitioned. */
@transient val partitioner: Option[Partitioner] = None
//MappedRDD
private[spark]
class MappedRDD[U: ClassTag, T: ClassTag](prev: RDD[T], f: T => U)
extends RDD[U](prev) {
override def getPartitions: Array[Partition] = firstParent[T].partitions
override def compute(split: Partition, context: TaskContext) =
firstParent[T].iterator(split, context).map(f)
}