首页 > 技术文章 > Spark中flatMap、Map以及mapPartitions的区别

Ao0216 2022-02-17 17:26 原文

一、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是按照分区进行运算的。

 

推荐阅读