【spark】map和mapPartitions区别-代码示例


一、简单示例

1、map示例

首先来一个简单的小例子,集合中一些数据,看这些数据是如何经过map的。
代码如下(示例):

  def main(args: Array[String]): Unit = {
    val sparkconf = new SparkConf().setMaster("local[*]").setAppName("test")
    var sc =  new SparkContext(sparkconf);
    val rdd = sc.makeRDD(List(1,2,3,4),1)
    //num只出现了一次,而且是按照顺序出现的,则num可以通过  _ 来表示
    val value = rdd.map(num=>{
      println(">>>>"+num);
      num
    })
    val value2 = value.map(num=>{
      println("-----"+num);
      num
    })
    value2.collect()
    sc.stop();
  }

输出:

>>>>1
-----1
>>>>2
-----2
>>>>3
-----3
>>>>4
-----4

如上所示,在一个分区到时候是将分区内的所有的数据,依次执行完所有的操作,再执行下一条数据。
当设置为两个分区的时候。

val rdd = sc.makeRDD(List(1,2,3,4),2)

有如下输出,证明两个分区的数据并行执行,每个分区都是一条一条执行。分区内的数据也是按照顺序执行的。

>>>>1
>>>>3
-----3
-----1
>>>>4
>>>>2
-----4
-----2

2、mapPartitions示例

  def main(args: Array[String]): Unit = {
    val sparkconf = new SparkConf().setMaster("local[*]").setAppName("test")
    var sc =  new SparkContext(sparkconf);
    val rdd = sc.makeRDD(List(1,2,3,4),2)
    val value = rdd.mapPartitions(iter=>{
      println(">>>>");
      iter
    })
    value.collect()
    sc.stop();
  }

mapPartitions和map的入参有一点区别,map是一个num数值,但是mapPartitions是一个迭代器,这个迭代器代表一个分区的全部数据,例如在2个分区中,只打印了两次。

>>>>
>>>>

如此说明,mapPartitions是一个分区一个分区的执行,当分区内所有数据处理完成,才会释放分区的数据。如此看来这两个功能及其类似。另外这两个分区的执行是无序的,如果只想取某一个分区的数据可使用mapPartitionsWithIndex(index,iter)来指定分区。
但是,如果想得到分区中的最大值呢?这个功能mapPartitions实现起来就有先天的优势了。

  def main(args: Array[String]): Unit = {
    val sparkconf = new SparkConf().setMaster("local[*]").setAppName("test")
    var sc =  new SparkContext(sparkconf);
    val rdd = sc.makeRDD(List(1,2,3,4),2)
    val value = rdd.mapPartitions(iter=>{
      List(iter.max).iterator
    })
    value.collect().foreach(println)
    sc.stop();
  }

总结

  • 数据处理角度 Map算子是分区内一个数据一个数据的执行,类似于串行操作。而 mapPartitions 算子是以分区为单位进行批处理操作。
  • 功能的角度 Map 算子主要目的将数据源中的数据进行转换和改变。但是不会减少或增多数据。
    MapPartitions 算子需要传递一个迭代器,返回一个迭代器,没有要求的元素的个数保持不变,所以可以增加或减少数据
  • 性能的角度 Map算子因为类似于串行操作,所以性能比较低,而是 mapPartitions算子类似于批处
    理,所以性能较高。但是 mapPartitions 算子会长时间占用内存,那么这样会导致内存可能不够用,出现内存溢出的错误。所以在内存有限的情况下,不推荐使用。可以使用 map 操作。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁滴水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值