SparkRDD——行动算子

2024-04-30 18:08
文章标签 算子 行动 sparkrdd

本文主要是介绍SparkRDD——行动算子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、行动算子定义

spark的算子可以分为trans action算子 以及 action算子 ,即变换/转换 算子。如果执行一个RDD算子并不触发作业的提交,仅仅只是记录作业中间处理过程,那么这就是trans action算子 ,相反如果执行这个 RDD 时会触发 Spark Context 提交 Job 作业,那么它就是 action算子及行动算子。
总结来说就是在Spark中,转换算子并不会马上进行运算的,即所谓的“惰性运算”,而是在遇到行动算子时才会执行相应的语句的,触发Spark的任务调度并开始进行计算。
我们可以将行动算子分为两类:

  • 1,数据运算类:主要用于触发RDD计算,并得到计算结果返回给Spark程序或Shell界面;
  • 2,数据存储类:用于触发RDD计算后,将结果保存到外部存储系统中,如HDFS文件系统或数据库。

二、总览

一、数据运算类:
1、reduce              将rdd中的数据进行聚合,先进行分区内聚合,在进行分区间聚合
2、collect             将rdd中的数据按分区号采集,并以数组的形式返回所有数据
3、collectAsMap        收集Key/Value型RDD中的元素,并以map的形式返回数据
4、foreach             循环遍历分区内数据,该算子执行位置是在Executor端
5、count               计算rdd中数据个数
6、first               取rdd中数据的第一个
7、take                取rdd中数据的前num个
8、takeOrdered         将rdd中的数据进行排序后取前num个
9、aggregate           类似于aggregateByKey算子,同样两个参数列表,分别传递初始值和分区内计算规则和分区间计算规则。
10、fold               简化版的aggregate,分区内计算规则和分区间计算规则一样。
11、countByKey         根据键值对中的key进行计数,返回一个map,对应了每个key在rdd中出现的次数。
12、countByValue       根据rdd中数据的数据值进行计数,注不是键值对中的value,同样返回一个map,对应每个数据出现的次数。
13、max                求rdd中数据的最大值
14、min                求rdd中数据的最小值
二、数据存储类:
1、saveAsTextFile      存储为文本文件         
2、saveAsObjectFile    存储为二进制文件
3、saveAsSequenceFile  要求数据必须为<k,v>类型, 保存为 Sequencefile文件

注:sequenceFile文件是Hadoop用来存储二进制形式的 (Key,Value) 对而设计的一种平面文件。详细可以看这篇文章了解:链接

三、数据运算类action算子

1、reduce

通过传入的方法聚集rdd中所有的元素,先聚合分区内的数据,再聚合分区间的数据
def reduce(f: (T, T) => T): T

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
val count: Int = rdd.reduce((_: Int) + (_: Int))

在这里插入图片描述

2、collect

数据采集,以数组Array的形式按分区顺序返回数据集中的所有元素
def collect(): Array[T]

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
val ints: Array[Int] = rdd.collect()
println(ints.mkString(","))

在这里插入图片描述

3、collectAsMap

收集Key/Value型RDD中的元素,并以map的形式返回数据
注:只有key/value类型的RDD才有这个方法
def collectAsMap(): Map[K, V]

val rdd2: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("a", 2), ("b", 3), ("c", 1)))
val map: collection.Map[String, Int] = rdd2.collectAsMap()
println(map.mkString(","))

在这里插入图片描述

4、foreach

循环遍历分区内数据,该算子执行位置是在Executor端
def foreach(f: T => Unit): Unit

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
rdd.collect().foreach(print)
println()
println("********************")
rdd.foreach(print)

在这里插入图片描述

5、count

返回rdd中元素的个数,即collect返回的数组的长度
def count(): Long

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
val count: Long = rdd.count()
println(count)

在这里插入图片描述

6、first

返回rdd中的第一个元素,即collect返回的数组的第一个元素
def first(): T

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
val first: Int = rdd.first()
println(first)

在这里插入图片描述

7、take

返回rdd中的前n个元素,即collect返回的数组的前n个元素
def take(num: Int): Array[T]

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
val ints: Array[Int] = rdd.take(3)
println(ints.mkString(","))

在这里插入图片描述

8、takeOrdered

返回rdd中排序后的前n个元素
def takeOrdered(num: Int)(implicit ord: Ordering[T]): Array[T]

val rdd: RDD[Int] = sc.makeRDD(List(4, 2, 1, 3))
val ints: Array[Int] = rdd.takeOrdered(3)
println(ints.mkString(","))

在这里插入图片描述

9、aggregate

与aggregateByKey类似,需要传入两个参数列表,列表元素意义也相同

  • 第一个列表,传入初始的比较值
  • 第二个参数列表传入两个函数,分别表示分区内计算规则和分区间计算规则

aggregateByKey:初始值只会参与分区内计算
aggregate:初始值既会参与分区内计算也会参与分区间计算
def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4), 2)
val res: Int = rdd.aggregate(10)((_: Int) + (_: Int), (_: Int) + (_: Int))
// [1, 2] => 10 + 1 + 2 => 13
// [3, 4] => 10 + 3 + 4 => 17
// [13, 14] => 10 + 13 + 17 = 40
println(res)

在这里插入图片描述

10、fold

类似于foldByKey,即当aggregate的分区内和分区间计算规则相同时可以简化使用fold,只需要传入一个计算规则
def fold(zeroValue: T)(op: (T, T) => T): T

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4), 2)
val res: Int = rdd.fold(10)((_: Int) + (_: Int))
//[1, 2] => 10 + 1 + 2 => 13
//[3, 4] => 10 + 3 + 4 => 17
//[13, 14] => 10 + 13 + 17 = 40
println(res)

在这里插入图片描述

11、countByKey

用于统计键值对类型的数据中每个key出现的个数
def countByKey(): Map[K, Long]

val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("a", 2), ("b", 3), ("c", 1)))
val res: collection.Map[String, Long] = rdd.countByKey()
println(res)

在这里插入图片描述

12、countByValue

根据rdd中数据的数据值进行计数,注不是键值对中的value,同样返回一个map,对应每个数据出现的次数。
def countByValue()(implicit ord: Ordering[T] = null): Map[T, Long]

val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
val rdd2: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("a", 2), ("b", 3), ("c", 1)))
val res1: collection.Map[Int, Long] = rdd.countByValue()
val res2: collection.Map[(String, Int), Long] = rdd2.countByValue()
println(res1)
println(res2)

在这里插入图片描述

13、max && min

返回rdd数据集中的最大值/最小值

def max()(implicit ord: Ordering[T]): T = withScope {this.reduce(ord.max)
}
def min()(implicit ord: Ordering[T]): T = withScope {this.reduce(ord.min)
}
val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
val rdd2: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("a", 2), ("b", 3), ("c", 1)))
println(rdd.max())
println(rdd2.max())
println(rdd.min())
println(rdd2.min())

在这里插入图片描述

这篇关于SparkRDD——行动算子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949556

相关文章

SparkRDD转DataSet/DataFrame的一个深坑

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! By  大数据技术与架构 场景描述:本文是根据读者反馈的一个问题总结而成的。 关键词:Saprk RDD 原需求:希望在map函数中将每一

spark算子集锦

Spark 是大数据领域的一大利器,花时间总结了一下 Spark 常用算子,正所谓温故而知新。 Spark 算子按照功能分,可以分成两大类:transform 和 action。Transform 不进行实际计算,是惰性的,action 操作才进行实际的计算。如何区分两者?看函数返回,如果输入到输出都是RDD类型,则认为是transform操作,反之为action操作。 准备 准备阶段包括s

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现 2

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现 2 flyfish 前置知识 1 前置知识 2 Host侧CPU和Device侧NPU的主要区别 不同的硬件资源 CPU是为了执行通用计算任务而设计的,但在处理大量的并行计算(如矩阵乘、批数据处理)时效率不高。NPU是为了加速机器学习和深度学习任务而设计的,它擅长执行大量的并行计算。N

fpga图像处理实战-边缘检测 (Roberts算子)

Roberts算子         Roberts算子是一种用于边缘检测的算子,主要用于图像处理中检测图像的边缘。它是最早的边缘检测算法之一,以其计算简单、速度快而著称。Roberts算子通过计算图像像素在对角方向的梯度来检测边缘,从而突出图像中灰度变化最剧烈的部分。 原理             Roberts算子通过对图像应用两个2x2的卷积核(也称为掩模或滤波器)来计算图像在水平和垂直

图像边缘检测技术详解:利用OpenCV实现Sobel算子

图像边缘检测技术详解:利用OpenCV实现Sobel算子 前言Sobel算子的原理代码演示结果展示结语 前言   在数字图像处理的广阔领域中,边缘检测技术扮演着至关重要的角色。无论是在科学研究、工业自动化,还是在日常生活中的智能设备中,我们都需要从图像中提取有用的信息。边缘,作为图像中亮度变化最显著的地方,为我们提供了识别和理解图像内容的关键线索。因此,边缘检测算法成为了计算机视

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现 flyfish 前置知识 基于Kernel直调工程的算子开发流程图 其中有一个Tiling实现 什么是Tiling、Tiling实现 计算API,包括标量计算API、向量计算API、矩阵计算API,分别实现调用Scalar计算单元、Vector计算单元、Cube计算单元执行计算的功

深度学习常用算子

深度学习常用算子 算子功能ReluReLU(x)=max(0,x)LeakyReluLeakyRelu(x) = (x >= 0 ? x : x*negative_slope)Relu6LeakyRelu(x) = max(max(x, 0), 6)Tantanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))sigmoidsigmoid(x) = 1.

计算机 软件 什么是算子

算法(algorithm)是为了达到某个目标,实施的一系列指令的过程,而指令包含算子(operator)和操作数(operand)。   算子:operator, 简单说来就是进行某种“操作“,动作。算法中的一个函数、几行可以重复使用的代码、一个数学中的平方操作,这些都可以认为是算子 操作数:operand,被操作的对象,称之为操作数。     广义的讲,对任何函数进行某一项操作都可以

网络价格管控行动:四大策略,打击低价

网络价格管控的举措 设定最低售价约束:品牌方能够与在线零售商订立协议,清晰界定产品的最低售价,以守护品牌形象与市场秩序。推行动态定价策略:依照市场需求、竞争态势以及库存状况动态调节产品价格,保障市场竞争力并防止库存积压。构建官方销售途径:借助官方电商平台或者自建网上商城直接面向消费者开展销售,缩减中间环节,降低销售成本,更优地掌控产品价格。加大监管与惩罚力度:针对违背价格管控规定的零售商施行警告

Halcon提取边缘线段lines_gauss 算子

Halcon提取边缘线段lines_gauss 算子 edges_color_sub_pix和edges_sub_pix两个算子使用边缘滤波器进行边缘检测。还有一个常用的算子lines_gauss算子,也可以用于提取边缘线段,它的鲁棒性非常好,提取出的线段类型是亚像素精度的XLD轮廓。其原型如下: lines gauss(Image : Lines : Sigma, Low, High, Li