一、flatMap
作用:首先将函数应用于RDD的所有元素,然后将结果展平,返回一个新的RDD。
应用场景:文件中的所有行数据仅返回了一个数组对象。(即:Map映射 + 数据扁平化操作)
二、Map
作用:将处理的数据逐条进行映射转换,这里的转换可以是类型的转换,也可以是值的转换。通过将函数应用于此RDD的所有元素,返回一个新RDD。
应用场景:文件中的每一行数据返回了一个数组对象;
三、mapPartitions
作用:将待处理的数据以分区为单位发送到计算节点进行处理,这里的处理是指可以进行任意的处理,哪怕是过滤数据。通过对RDD的每个分区应用一个函数来返回一个新的RDD。
应用场景:当数据量不太大的时候,可以用mapPartitions,可以提高运行效率。当数据量太大的时候,有可能会发生oom。
问题:map和mapPartitions的区别?
- 数据处理角度:Map算子是分区内一个数据一个数据的执行,类似于串行操作。而mapPartitions算子是以分区为单位进行批处理操作;
- 功能的角度:Map算子主要目的将数据源中的数据进行转换和改变。但是不会减少或增多数据。MapPartitions算子需要传递一个迭代器,返回一个迭代器,没有要求的元素的个数保持不变,所以可以增加或减少数据 ;
- 性能角度:Map算子因为类似于串行操作,所以性能比较低,而是mapPartitions算子类似于批处理,所以性能较高。但是mapPartitions算子会长时间占用内存,那么这样会导致内存可能不够用,出现内存溢出的错误。所以在内存有限的情况下,不推荐使用。
四、示例
1、生成一个RDD,并设置2个分区
2、使用map是所有元素加1
3、使用mapPartitions 使所有元素加1
此时,结果是一致的,但mapPartitions运行效率更高。
4、将RDD中的元素倒置
此时可以看到,mapPartitions是按照分区进行运算的。