比较map flatMap mapPartitions mapPartitionsWithIndex
Spark中,最基本的原则,就是每个task处理一个RDD的partition。
MapPartitions操作的优点:
如果是普通的map,比如一个partition中有1万条数据;ok,那么你的function要执行和计算1万次。 但是,使用MapPartitions操作之后,一个task仅仅会执行一次function,function一次接收所有 的partition数据。只要执行一次就可以了,性能比较高。 MapPartitions的缺点:可能会OOM。
如果是普通的map操作,一次function的执行就处理一条数据;那么如果内存不够用的情况下, 比如处理了1千条数据了,那么这个时候内存不够了,那么就可以将已经处理完的1千条数据从 内存里面垃圾回收掉,或者用其他方法,腾出空间来吧。
mapPartition():每次处理一个分区的数据,这个分区的数据处理完后,原RDD中分区的数据才能释 放,可能导致OOM。 所以说普通的map操作通常不会导致内存的OOM异常。
flatMap:
def flatMap[U](f: (T) ⇒ TraversableOnce[U])(implicit arg0: ClassTag[U]): RDD[U]
scala> val a = sc.parallelize(1 to 10, 5) a: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[3] at parallelize at <console