Spark:常用transformation及action,spark算子详解

Spark:常用transformation及action,spark算子详解

一、常用transformation介绍

操作介绍
map将RDD中的每个元素传入自定义函数,获取一个新的元素,然后用新的元素组成新的RDD
filter对RDD中每个元素进行判断,如果返回true则保留,返回false则剔除
flatMap与map类似,但是对每个元素都可以返回一个或多个新元素
groupByKey根据key进行分组,每个key对应一个Iterable<value>
reduceByKey对每个Key对应的value进行reduce操作
sortByKey对每个key对应的value进行排序操作
join对两个包含<key,value>的RDD进行join操作,每个key join上的pair,都会传入自定义函数进行处理
cogroup同join,但是每个key对应的Itreable<value>都会传入自定义函数进行处理

1.1 transformation操作实例

Spark练习之Transformation操作开发

二、常用action介绍

操作介绍
reduce将RDD中的所有元素进行聚合操作,第一个和第二个元素聚合,值与第三个元素聚合,值与第四个元素聚合,以此类推
collect将RDD中所有元素获取到本地客户端
count获取RDD元素总数
take(n)获取RDD中前n个元素
saveAsTextFile将RDD元素保存到文件中,对每个元素调用toString方法
countByKey对每个key对应的值进行count计数
foreach遍历RDD中的每个元素

2.1 action操作实例

Spark练习之action操作开发

三、spark算子详解

3.1弹性分布式数据集 (RDD)

spark中很重要的一个概念RDD(弹性分布式数据集)它是可以执行并行操作且跨集群节点的元素的集合。RDD 可以从一个 Hadoop 文件系统(或者任何其它 Hadoop 支持的文件系统),或者一个在 driver program(驱动程序)中已存在的 Scala 集合,以及通过 transforming(转换)来创建一个 RDD。用户为了让它在整个并行操作中更高效的重用,也许会让 Spark persist(持久化)一个 RDD 到内存中。最后,RDD 会自动的从节点故障中恢复。

RDDs support 两种类型的操作: transformations(转换), 它会在一个已存在的 dataset 上创建一个新的 dataset, 和 actions(动作), 将在 dataset 上运行的计算后返回到 driver 程序. 例如, map 是一个通过让每个数据集元素都执行一个函数,并返回的新 RDD 结果的 transformation, reducereduce 通过执行一些函数,聚合 RDD 中所有元素,并将最终结果给返回驱动程序(虽然也有一个并行 reduceByKey 返回一个分布式数据集)的 action.

Spark 中所有的 transformations 都是 lazy(懒加载的), 因此它不会立刻计算出结果. 相反, 他们只记得应用于一些基本数据集的转换 (例如. 文件). 只有当需要返回结果给驱动程序时,transformations 才开始计算. 这种设计使 Spark 的运行更高效. 例如, 我们可以了解到,map 所创建的数据集将被用在 reduce 中,并且只有 reduce 的计算结果返回给驱动程序,而不是映射一个更大的数据集.

默认情况下,每次你在 RDD 运行一个 action 的时, 每个 transformed RDD 都会被重新计算。但是,您也可用 persist (或 cache) 方法将 RDD persist(持久化)到内存中;在这种情况下,Spark 为了下次查询时可以更快地访问,会把数据保存在集群上。此外,还支持持续持久化 RDDs 到磁盘,或复制到多个结点。

3.2Spark 算子大致可以分为以下两类

3.2.1Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理

Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,可以理解为懒加载,需要等到有 Action 操作的时候才会真正触发运算。

3.2.2Action 行动算子:这类算子会触发 SparkContext 提交 Job 作业

Action 算子会触发 Spark 提交作业(Job),spark job的划分就是依据action算子.

很多spark的初学者都会对这样的设计感到疑惑,为什么要这么呢,这样岂不是很麻烦,很复杂吗?,其实,这正是spark设计的精髓之处.

比如我要对一个RDD进行count统计里面有多少条记录,然后我又想filter里面包含jason的信息有多少条,实际上在第一次的时候不需要把所有的数据都加载到RDD里面,而在filter的时候只加载符合条件的那一部分即可,这样就会快很多。

3.2.3区分transformation算子和action算子

transformation算子一定会返回一个rdd,action大多没有返回值,也可能有返回值,但是一定不是rdd.

https://www.cnblogs.com/aixing/p/13327439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值