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),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
在这个项目中,我们重点关注的是如何使用Spark MLlib和Scala来实现中文文本的分词和分类,特别是通过逻辑回归模型进行文本分类。 首先,中文分词是处理中文文本的前提步骤,因为中文没有明显的空格来分隔单词。在...
与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 ...
Flink 和 Spark 都是大数据处理领域中的重要框架,本文将对它们进行比较,分别介绍它们的核心实现、计算模型、硬件需求、数据源集成、性能对比等方面。 核心实现 Apache Spark 是基于 Scala 语言实现的,提供了 ...
在 Linux 操作系统中,Spark 的安装和搭建环境需要使用到许多指令。这些指令包括: * cd:改变当前目录的命令。 * mkdir:创建新目录的命令。 * ln:创建链接的命令。 * mkfontdir:生成 fonts.dir 文件的命令。 * ...
在`pom.xml`文件中添加Spark的Maven依赖,如`spark-core`和`spark-sql`,同时还需要添加Spring Boot的Web依赖,以便创建RESTful API。 在代码实现上,我们可以创建一个`SparkConfig`类,使用Spring Boot的`@...
Spark是Apache软件基金会下的一个开源大数据处理框架,它在大数据领域扮演着重要的角色,尤其在实时数据处理和批处理方面表现突出。Spark-3.1.2.tgz和Spark-3.1.2-bin-hadoop2.7.tgz是两个不同格式的Spark发行版,...
本资源为 Spark 编程指南简体中文版,涵盖了 Spark 的基本概念、数据处理、流处理、图形处理和 SQL 等方面的内容。以下是该资源中的知识点总结: Spark 基础 * Spark Shell:交互式 shell,用于快速上手 Spark * ...
标题中的“IK分词器通过Spark加载词典并在Spark中使用”揭示了本文将要讨论的核心技术点,即如何利用Apache Spark与IK分词器(Intelligent Chinese Analyzer)结合,来处理中文文本分词任务。IK分词器是Java语言开发...
Spark 内存管理和分配是 Spark 中的核心组件之一,它负责管理和分配 Spark 应用程序中的内存资源。Spark 的内存管理机制是通过 SparkConf 的配置来控制的,在 SparkEnv.scala 中的 349 行就获取了之前的配置。 ...
在本主题中,我们将深入探讨Spark的早期版本——Spark 0.2和Spark 0.5,这两个版本对Spark的发展起到了重要的奠基作用。 **Spark 0.2** Spark 0.2是Spark的第一个公开发布的版本,它标志着Spark项目正式进入公众...
Spark是Apache基金会下的一个开源大数据处理框架,以其高效、易用和可扩展性著称。Spark的核心设计理念是基于内存计算,极大地提升了数据处理速度。在本压缩包中,"spark-3.4.0-bin-without-hadoop"是Spark的一个预...
Spark时间序列分析是一种在大数据处理领域中用于挖掘和预测数据趋势的重要工具,特别是在金融、气象、电商等领域。本文将深入探讨使用Scala语言在Spark平台上实现ARIMA(自回归积分滑动平均模型)和Holt-Winters三次...
首先,Spark是大数据处理框架中的明星,它提供了DataFrame和RDD(弹性分布式数据集)等数据抽象,支持批处理、流处理和交互式查询等多种计算模式。Scala作为Spark的主要编程语言,其强大的函数式编程特性使得Spark ...
【Spark 初级编程实践】 Spark 是一个分布式计算框架,常用于大数据处理,它提供了高效的数据...同时,实验也强调了 Scala 作为 Spark 的主要编程语言,以及 sbt 和 spark-submit 在构建和部署 Spark 应用中的作用。
在标题"spark-hive-2.11和spark-sql-以及spark-hadoop包另付下载地址"中,我们关注的是Spark与Hive的特定版本(2.11)的集成,以及Spark SQL和Spark对Hadoop的支持。这里的2.11可能指的是Scala的版本,因为Spark是用...
Spark-2.3.1源码解读。 Spark Core源码阅读 Spark Context 阅读要点 ...Dstream join 操作和 RDD join 操作的区别 PIDController源码赏析及 back pressure 实现思路 Streaming Context重点摘要 checkpoint 必知必会
在SparkDemo中,你可以找到如何使用Scala、Java或Python API实现Spark Count的示例代码,这有助于理解Spark的基本操作和编程模型。 接着,Spark SQL是Spark的一个重要组件,它允许用户使用SQL查询数据,同时支持...
3. 通用性强:Spark 生态圈包含了 Spark Core、SparkSQL、Spark Streaming、MLLib 和 GraphX 等组件,这些组件分别处理 SparkCore 提供内存计算框架、SparkStreaming 的实时处理应用、Spark SQL 的即席查询、MLlib ...
它将Spark和TiDB深度集成,在原有MySQL Workload之外借助Spark支持了更多样的用户场景和API。这个项目在SparkSQL和Catalyst引擎之外实现了一套扩展的,为TiDB定制的SQL前端(Parser,Planner和优化器):它了解TiDB...