spark算子-map vs mapPartitions算子

26 篇文章 0 订阅
25 篇文章 2 订阅

1.源码

1.1.map算子源码

def map[U: ClassTag](f: T => U): RDD[U] = withScope {
    val cleanF = sc.clean(f)
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
  }

1.2.mapPartitions算子源码

def mapPartitions[U: ClassTag](
      f: Iterator[T] => Iterator[U],
      preservesPartitioning: Boolean = false): RDD[U] = withScope {
    val cleanedF = sc.clean(f)
    new MapPartitionsRDD(
      this,
      (context: TaskContext, index: Int, iter: Iterator[T]) => cleanedF(iter),
      preservesPartitioning)
  }

1.3.对比

相似
	map算子和mapPartitions算子底层都是构件MapPartitionsRDD
区别
	函数功能方面
		map算子传入的函数的功能,是将一个元素处理后返回另一个元素;
		mapPartitions算子传入的函数的功能,是将一个迭代器(一批元素)处理后返回另一个迭代器(一批元素);
	函数执行方面
		map算子中,一个迭代器中包含算子需要处理的所有元素,有多少个元素,传入的函数就执行多少次;
		mapPartitions算子中,一个迭代器包含一个分区中的所有元素,函数一次处理一个迭代器的数据,即一个分区调用一次函数;

1.4.执行次数验证

代码

val lineSeq = Seq(
      "hello me you her",
      "hello you her",
      "hello her",
      "hello"
    )

    val rdd = sc.parallelize(lineSeq, 2)
      .flatMap(_.split(" "))
    
    println("===========mapPartitions.start==============")
    rdd.mapPartitions(iter => {
      println("mp+1")
      iter.map(x =>
        (x, 1)
      )
    }).collect()
    
    println("===========map.start==============")
    rdd.map(x => {
      println("mp+2")
      (x, 1)
    }).collect()

执行结果
在这里插入图片描述

2.特点

map算子
	有多少元素,函数执行多少次
mapPartitions算子
	有多少分区,函数执行多少次	
	函数参数是一个迭代器,返回的也是一个迭代器

3.使用场景分析

在进行简单元素表现形式转换操作时,建议使用map算子,避免使用mapPartitions算子:
	mapPartitions的函数需要返回一个迭代器,在处理简单元素表现形式的转换操作时,需要用一个中间缓存将处理结果存储起来,然后再转换为迭代器缓存;这个情况下,中间缓存是存放在内存中的,如果迭代器中需要处理的元素比较多,容易引起OOM;
在在大数据集情况下的资源初始化开销和批处理处理的场景中,建议使用mapPartitions算子:
	基于spark分布式执行算子的特性,每个分区都需要单独做一次资源初始化;mapPartitions一个分区只执行一次函数的优势可以实现一个分区只需进行一次资源初始化(eg:需要进行数据库链接的场景);

4.参考资料

Spark系列——关于 mapPartitions的误区
Spark—算子调优之MapPartitions提升Map类操作性能
Learning Spark——Spark连接Mysql、mapPartitions高效连接HBase
mapPartition

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark算子Spark框架中的一种操作符,用于对RDD(弹性分布式数据集)进行转换和操作。Scala版本的Spark算子可以通过编写Scala代码来实现,常用的算子包括map、filter、reduce、join等。这些算子可以帮助开发者快速地进行数据处理和分析,提高数据处理效率和准确性。 ### 回答2: Spark算子Spark中的一个很重要的概念,它主要是用于数据的转换和处理。在Scala版本中,Spark算子有两种不同的类型,一个是转换操作的算子,另一个是行动操作的算子。这些算子被组织成RDD的API,以便在分布式环境中进行操作,从而实现高效的计算。 对于Spark算子来说,它的灵活性和方便性是非常重要的。因为在实际应用中,数据的处理往往是非常复杂和混杂的。这时,使用Spark算子可以很快地将数据转换成需要的格式,以便进行后续的处理。同时,Spark算子还可以极大地提高处理数据的效率,因为它们是在分布式集群上进行处理的,这样就可以大大缩短处理时间。 在Scala版本中,首要的算子map算子,它可以非常方便地对数据进行转换。除此之外,还有很多常用的算子,比如flatMap、reduceByKey、groupBy等,它们都具有一些独特的特性和用法,可以根据实际情况选择使用。当然,对于更加复杂的数据处理操作,也可以自定义函数来实现。Spark算子可以很容易地与自定义函数进行结合,从而实现更加灵活的数据处理操作。 总之,Spark算子Spark中一个非常重要的概念,它可以帮助我们高效地转换和处理数据。在Scala版本中,Spark算子是非常方便和易用的,可以满足各种不同场景下的需求。无论是初学者还是专业人士,都可以通过学习Spark算子来进一步提高自己的数据处理和计算能力。 ### 回答3: Spark是一种流行的分布式计算框架,它提供了自己的编程模型,称为Resilient Distributed Datasets(RDDs)。Scala是一种运行在Java虚拟机上的编程语言,它可以与Spark很好地配合使用,为Spark提供了Scala API,使得开发者可以使用Scala语言进行Spark开发。 在Scala API中,Spark提供了很多有用的算子,这些算子可以用于在分布式集群上操作RDDs。这些算子可以分为两类:转换算子和动作算子。 转换算子用于接受一个RDD,并返回一个新的RDD,这个新的RDD表示对原始RDD的一些转换操作。在这里,我们可以使用各种不同的转换功能,例如map、flatMap和filter。这些算子允许我们执行各种数据操作,例如将一组元素映射到另一组元素,或者仅选择符合某些条件的元素,等等。 动作算子用于接受一个RDD,并返回单个结果。这些算子执行过程中会计算原始RDD的结果,并将结果返回给驱动程序。这些算子包括reduce、count、collect和foreach等。在这里,我们可以使用这些算子计算和收集RDD中特定的元素或结果。 总之,Spark算子Spark Scala API中的核心组件,使得开发者可以简便地操作分布式计算集群上的大型数据集。这些算子是开发Spark应用程序的基本部分,开发者应该了解它们的工作方式,以便能够更高效地处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值