`
qindongliang1922
  • 浏览: 2199093 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117984
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126352
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60347
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71673
社区版块
存档分类
最新评论

Spark中foreachPartition和mapPartitions的区别

阅读更多


spark的运算操作有两种类型:分别是Transformation和Action,区别如下:




Transformation:代表的是转化操作就是我们的计算流程,返回是RDD[T],可以是一个链式的转化,并且是延迟触发的。

Action:代表是一个具体的行为,返回的值非RDD类型,可以一个object,或者是一个数值,也可以为Unit代表无返回值,并且action会立即触发job的执行。




Transformation的官方文档方法集合如下:

````
map
filter
flatMap
mapPartitions
mapPartitionsWithIndex
sample
union
intersection
distinct
groupByKey
reduceByKey
aggregateByKey
sortByKey
join
cogroup
cartesian
pipe
coalesce
repartition
repartitionAndSortWithinPartitions

````



Action的官方文档方法集合如下:
````
reduce
collect
count
first
take
takeSample
takeOrdered
saveAsTextFile
saveAsSequenceFile
saveAsObjectFile
countByKey
foreach

````


结合日常开发比如常用的count,collect,saveAsTextFile他们都是属于action类型,结果值要么是空,要么是一个数值,或者是object对象。其他的如map,filter返回值都是RDD类型的,所以简单的区分两个不同之处,就可以用返回值是不是RDD[T]类型来辨别。


接着回到正题,我们说下foreachPartition和mapPartitions的分别,细心的朋友可能会发现foreachPartition并没有出现在上面的方法列表中,原因可能是官方文档并只是列举了常用的处理方法,不过这并不影响我们的使用,首先我们按照上面的区分原则来看下foreachPartition应该属于那种操作,官网文档的这个方法api如下:
````
public void foreachPartition(scala.Function1<scala.collection.Iterator<T>,scala.runtime.BoxedUnit> f)

Applies a function f to each partition of this RDD.

Parameters:
f - (undocumented)
````


从上面的返回值是空可以看出foreachPartition应该属于action运算操作,而mapPartitions是在Transformation中,所以是转化操作,此外在应用场景上区别是mapPartitions可以获取返回值,继续在返回RDD上做其他的操作,而foreachPartition因为没有返回值并且是action操作,所以使用它一般都是在程序末尾比如说要落地数据到存储系统中如mysql,es,或者hbase中,可以用它。


当然在Transformation中也可以落地数据,但是它必须依赖action操作来触发它,因为Transformation操作是延迟执行的,如果没有任何action方法来触发,那么Transformation操作是不会被执行的,这一点需要注意。



一个foreachPartition例子:

````scala
    val sparkConf=new SparkConf()
     val sc=new SparkContext(sparkConf)
      sparkConf.setAppName("spark demo example ")
    val rdd=sc.parallelize(Seq(1,2,3,4,5),3)
    
    rdd.foreachPartition(partiton=>{
      // partiton.size 不能执行这个方法,否则下面的foreach方法里面会没有数据,
      //因为iterator只能被执行一次
      partiton.foreach(line=>{
        //save(line)  落地数据
      })

    })
    
    sc.stop()
````


一个mapPartitions例子:
````
     val sparkConf=new SparkConf()
     val sc=new SparkContext(sparkConf)
      sparkConf.setAppName("spark demo example ")
    val rdd=sc.parallelize(Seq(1,2,3,4,5),3)

    rdd.mapPartitions(partiton=>{
      //只能用map,不能用foreach,因为foreach没有返回值
      partiton.map(line=>{
        //save line
      }
      )
    })

    rdd.count()//需要action,来触发执行
    sc.stop()
````



最后,需要注意一点,如果操作是iterator类型,我们是不能在循环外打印这个iterator的size,一旦执行size方法,相当于iterato就会被执行,所以后续的foreach你会发现是空值的,切记iterator迭代器只能被执行一次。




参考文档:

http://spark.apache.org/docs/2.1.1/api/java/org/apache/spark/rdd/RDD.html

https://spark.apache.org/docs/2.1.0/rdd-programming-guide.html

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
0
0
分享到:
评论

相关推荐

    【Spark调优篇02】Spark之算子调优1

    本文主要关注的是Spark的算子调优,包括`mapPartitions`、`foreachPartition`、`filter`与`coalesce`的配合使用,以及`repartition`解决Spark SQL低并行度问题。 首先,我们来看`mapPartitions`的优化。相比于`map`...

    spark面试资料

    #### 二、Spark中常用算子的区别 - **map**: 适用于每一个数据项应用函数并返回新的RDD。属于转换算子。 - **foreach**: 遍历每一个数据项并应用函数,但不返回任何结果。属于行动算子。 - **mapPartitions**: 对每...

    Spark大数据技术与应用教学大纲.pdf

    - Spark与Hadoop的区别与联系:比较两者在大数据处理中的优缺点,理解Spark的高效率和易用性。 - Spark的应用场景:涵盖机器学习、实时流处理、图计算等多个领域。 - Spark的生态系统:包括SparkCore、Spark...

    Spark-Spark的开发调优.pdf

    本文旨在深入探讨Spark开发调优中的关键原则和技术点,帮助开发者更好地理解和优化Spark应用。 #### 二、开发调优概述 **开发调优**是Spark性能优化的第一步,其核心在于遵循一系列的基本开发原则,确保在编写...

    HBaseonBeam.pdf

    - MapPartitions和ForeachPartition:对分区进行映射和操作。 - BulkLoad:批量加载数据到HBase,以及批量加载薄行(Thin Rows)。 5. Beam的运行环境和兼容性: Apache Beam通过Runners支持在不同的处理引擎中运行...

    藏经阁-HBase on Beam.pdf

    HBase on Beam 的操作包括 Scan、BulkGet、BulkPut、BulkDelete、MapPartitions 和 ForeachPartition 等。这些操作可以组合使用,以满足不同的业务需求。 HBase on Beam 的示例包括 Scan、BulkGet 和 BulkPut 等。...

Global site tag (gtag.js) - Google Analytics