- map:遍历RDD,将函数f应用于每一个元素,返回新的RDD(transformation算子)。
- foreach:遍历RDD,将函数f应用于每一个元素,无返回值(action算子)。
- mapPartitions:遍历操作RDD中的每一个分区,返回新的RDD(transformation算子)。
- foreachPartition:遍历操作RDD中的每一个分区。无返回值(action算子)。
mapPartitions的优点:
若使用map,比如一个partition中有1万条数据。那么function要计算1万次。
若使用mapPartitions,一个partition仅会执行一次function,性能比较高。
例如:在map过程中需要创建额外的对象(如创建jdbc连接),map算子需要为每个元素创建一个连接,而mapPartitions只需为每个partition创建一个连接。
mapPartitions的缺点:
如果是map操作,一次function处理一条数据,一般不会出现内存问题。但是MapPartitions操作,对于大量数据来说,比如一个partition有100万条数据,一次传入一个function以后,极有可能造成内存溢出(OOM)。
总结:内存充足的情况下,使用mapPartitions或foreachPartition比map和foreach更加高效。真正生产上,把RDD的数据写入到DB是使用foreachPartition。