【Spark】RDD操作详解4——Action算子

Spark RDD中两种算子之一:常见Action算子小结 常见Action算子: reduce(func):通过函数func聚集集合中的所有的元素。func函数接收2个参数,返回一个值。这个函数必须是关联性的,确保可以被正确地并发执行。这个算子不像reduceByKey一样通过key进行分组,所以其是一个全量的操作。 collect():在Driver的程序中,以数组的形式,返回数据集的所有元素。但是,请注意,这个只能在返回一个较小的数据子集时才能使用... 阅读详情


本质上在Actions算子中通过SparkContext执行提交作业的runJob操作,触发了RDD DAG的执行。
根据Action算子的输出空间将Action算子进行分类:无输出、 HDFS、 Scala集合和数据类型。

无输出

foreach

对RDD中的每个元素都应用f函数操作,不返回RDD和Array,而是返回Uint。

图中,foreach算子通过用户自定义函数对每个数据项进行操作。 本例中自定义函数为println,控制台打印所有数据项。

源码:

      
1
2
3
4
5
6
7
      
/**
* Applies a function f to all elements of this RDD.
*/
def foreach(f: T => Unit) {
val cleanF = sc.clean(f)
sc.runJob(this, (iter: Iterator[T]) => iter.foreach(cleanF))
}

HDFS

(1)saveAsTextFile

函数将数据输出,存储到HDFS的指定目录。将RDD中的每个元素映射转变为(Null,x.toString),然后再将其写入HDFS。

图中,左侧的方框代表RDD分区,右侧方框代表HDFS的Block。 通过函数将RDD的每个分区存储为HDFS中的一个Block。

源码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
      
/**
* Save this RDD as a text file, using string representations of elements.
*/
def saveAsTextFile(path: String) {
// https://issues.apache.org/jira/browse/SPARK-2075
//
// NullWritable is a `Comparable` in Hadoop 1.+, so the compiler cannot find an implicit
// Ordering for it and will use the default `null`. However, it's a `Comparable[NullWritable]`
// in Hadoop 2.+, so the compiler will call the implicit `Ordering.ordered` method to create an
// Ordering for `NullWritable`. That's why the compiler will generate different anonymous
// classes for `saveAsTextFile` in Hadoop 1.+ and Hadoop 2.+.
//
// Therefore, here we provide an explicit Ordering `null` to make sure the compiler generate
// same bytecodes for `saveAsTextFile`.
val nullWritableClassTag = implicitly[ClassTag[NullWritable]]
val textClassTag = implicitly[ClassTag[Text]]
val r = this.mapPartitions { iter =>
val text = new Text()
iter.map { x =>
text.set(x.toString)
(NullWritable.get(), text)
}
}
RDD.rddToPairRDDFunctions(r)(nullWritableClassTag, textClassTag, null)
.saveAsHadoopFile[TextOutputFormat[NullWritable, Text]](path)
}
/**
* Save this RDD as a compressed text file, using string representations of elements.
*/
def saveAsTextFile(path: String, codec: Class[_ <: CompressionCodec]) {
// https://issues.apache.org/jira/browse/SPARK-2075
val nullWritableClassTag = implicitly[ClassTag[NullWritable]]
val textClassTag = implicitly[ClassTag[Text]]
val r = this.mapPartitions { iter =>
val text = new Text()
iter.map { x =>
text.set(x.toString)
(NullWritable.get(), text)
}
}
RDD.rddToPairRDDFunctions(r)(nullWritableClassTag, textClassTag, null)
.saveAsHadoopFile[TextOutputFormat[NullWritable, Text]](path, codec)
}

(2)saveAsObjectFile

saveAsObjectFile将分区中的每10个元素组成一个Array,然后将这个Array序列化,映射为(Null,BytesWritable(Y))的元素,写入HDFS为SequenceFile的格式。

图中,左侧方框代表RDD分区,右侧方框代表HDFS的Block。 通过函数将RDD的每个分区存储为HDFS上的一个Block。

源码:

      
1
2
3
4
5
6
7
8
      
/**
* Save this RDD as a SequenceFile of serialized objects.
*/
def saveAsObjectFile(path: String) {
this.mapPartitions(iter => iter.grouped( 10).map(_.toArray))
.map(x => (NullWritable.get(), new BytesWritable(Utils.serialize(x))))
.saveAsSequenceFile(path)
}

Scala集合和数据类型

(1)collect

collect相当于toArray,toArray已经过时不推荐使用,collect将分布式的RDD返回为一个单机的scala Array数组。 在这个数组上运用scala的函数式操作。

图中,左侧方框代表RDD分区,右侧方框代表单机内存中的数组。通过函数操作,将结果返回到Driver程序所在的节点,以数组形式存储。

源码:

      
1
2
3
4
5
6
7
      
/**
* Return an array that contains all of the elements in this RDD.
*/
def collect(): Array[T] = {
val results = sc.runJob( this, (iter: Iterator[T]) => iter.toArray)
Array.concat(results: _*)
}

(2)collectAsMap

collectAsMap对(K,V)型的RDD数据返回一个单机HashMap。对于重复K的RDD元素,后面的元素覆盖前面的元素。

图中,左侧方框代表RDD分区,右侧方框代表单机数组。数据通过collectAsMap函数返回给Driver程序计算结果,结果以HashMap形式存储。

源码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
      
/**
* Return the key-value pairs in this RDD to the master as a Map.
*
* Warning: this doesn't return a multimap (so if you have multiple values to the same key, only
* one value per key is preserved in the map returned)
*/
def collectAsMap(): Map[K, V] = {
val data = self.collect()
val map = new mutable.HashMap[K, V]
map.sizeHint(data.length)
data.foreach { pair => map.put(pair._1, pair._2) }
map
}

(3)reduceByKeyLocally

实现的是先reduce再collectAsMap的功能,先对RDD的整体进行reduce操作,然后再收集所有结果返回为一个HashMap。

源码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
      
/**
* Merge the values for each key using an associative reduce function, but return the results
* immediately to the master as a Map. This will also perform the merging locally on each mapper
* before sending results to a reducer, similarly to a "combiner" in MapReduce.
*/
def reduceByKeyLocally(func: (V, V) => V): Map[K, V] = {
if (keyClass.isArray) {
throw new SparkException( "reduceByKeyLocally() does not support array keys")
}
val reducePartition = (iter: Iterator[(K, V)]) => {
val map = new JHashMap[K, V]
iter.foreach { pair =>
val old = map.get(pair._1)
map.put(pair._1, if (old == null) pair._2 else func(old, pair._2))
}
Iterator(map)
} : Iterator[JHashMap[K, V]]
val mergeMaps = (m1: JHashMap[K, V], m2: JHashMap[K, V]) => {
m2.foreach { pair =>
val old = m1.get(pair._1)
m1.put(pair._1, if (old == null) pair._2 else func(old, pair._2))
}
m1
} : JHashMap[K, V]
self.mapPartitions(reducePartition).reduce(mergeMaps)
}

(4)lookup

Lookup函数对(Key,Value)型的RDD操作,返回指定Key对应的元素形成的Seq。这个函数处理优化的部分在于,如果这个RDD包含分区器,则只会对应处理K所在的分区,然后返回由(K,V)形成的Seq。如果RDD不包含分区器,则需要对全RDD元素进行暴力扫描处理,搜索指定K对应的元素。

图中,左侧方框代表RDD分区,右侧方框代表Seq,最后结果返回到Driver所在节点的应用中。

源码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      
/**
* Return the list of values in the RDD for key `key`. This operation is done efficiently if the
* RDD has a known partitioner by only searching the partition that the key maps to.
*/
def lookup(key: K): Seq[V] = {
self.partitioner match {
case Some(p) =>
val index = p.getPartition(key)
val process = (it: Iterator[(K, V)]) => {
val buf = new ArrayBuffer[V]
for (pair <- it if pair._1 == key) {
buf += pair._2
}
buf
} : Seq[V]
val res = self.context.runJob(self, process, Array(index), false)
res( 0)
case None =>
self.filter(_._1 == key).map(_._2).collect()
}
}

(5)count

count返回整个RDD的元素个数。

图中,返回数据的个数为5。一个方块代表一个RDD分区。

源码:

      
1
2
3
4
      
/**
* Return the number of elements in the RDD.
*/
def count(): Long = sc.runJob( this, Utils.getIteratorSize _).sum

(6)top

top可返回最大的k个元素。
相近函数说明:

top返回最大的k个元素。
take返回最小的k个元素。
takeOrdered返回最小的k个元素, 并且在返回的数组中保持元素的顺序。
first相当于top(1)返回整个RDD中的前k个元素,可以定义排序的方式Ordering[T],返回的是一个含前k个元素的数组。

源码

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
      
/**
* Returns the top k (largest) elements from this RDD as defined by the specified
* implicit Ordering[T]. This does the opposite of [[takeOrdered]]. For example:
*
* sc.parallelize(Seq(10, 4, 2, 12, 3)).top(1)
* // returns Array(12)
*
* sc.parallelize(Seq(2, 3, 4, 5, 6)).top(2)
* // returns Array(6, 5)
*
*
* @param num k, the number of top elements to return
* @param ord the implicit ordering for T
* @return an array of top elements
*/
def top(num: Int)(implicit ord: Ordering[T]): Array[T] = takeOrdered(num)(ord.reverse)

(7)reduce

reduce函数相当于对RDD中的元素进行reduceLeft函数的操作。
reduceLeft先对两个元素进行reduce函数操作,然后将结果和迭代器取出的下一个元素进行reduce函数操作,直到迭代器遍历完所有元素,得到最后结果。
在RDD中,先对每个分区中的所有元素的集合分别进行reduceLeft。每个分区形成的结果相当于一个元素,再对这个结果集合进行reduceleft操作。

图中,方框代表一个RDD分区,通过用户自定函数f将数据进行reduce运算。示例最后的返回结果为V1@V2U!@U2@U3@U4,12。

源码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
      
/**
* Reduces the elements of this RDD using the specified commutative and
* associative binary operator.
*/
def reduce(f: (T, T) => T): T = {
val cleanF = sc.clean(f)
val reducePartition: Iterator[T] => Option[T] = iter => {
if (iter.hasNext) {
Some(iter.reduceLeft(cleanF))
} else {
None
}
}
var jobResult: Option[T] = None
val mergeResult = (index: Int, taskResult: Option[T]) => {
if (taskResult.isDefined) {
jobResult = jobResult match {
case Some(value) => Some(f(value, taskResult.get))
case None => taskResult
}
}
}
sc.runJob( this, reducePartition, mergeResult)
// Get the final result out of our Option, or throw an exception if the RDD was empty
jobResult.getOrElse( throw new UnsupportedOperationException( "empty collection"))
}

(8)fold

fold和reduce的原理相同,但是与reduce不同,相当于每个reduce时,迭代器取的第一个元素是zeroValue。

图中,通过用户自定义函数进行fold运算,图中的一个方框代表一个RDD分区。

源码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      
/**
* Aggregate the elements of each partition, and then the results for all the partitions, using a
* given associative function and a neutral "zero value". The function op(t1, t2) is allowed to
* modify t1 and return it as its result value to avoid object allocation; however, it should not
* modify t2.
*/
def fold(zeroValue: T)(op: (T, T) => T): T = {
// Clone the zero value since we will also be serializing it as part of tasks
var jobResult = Utils.clone(zeroValue, sc.env.closureSerializer.newInstance())
val cleanOp = sc.clean(op)
val foldPartition = (iter: Iterator[T]) => iter.fold(zeroValue)(cleanOp)
val mergeResult = (index: Int, taskResult: T) => jobResult = op(jobResult, taskResult)
sc.runJob( this, foldPartition, mergeResult)
jobResult
}

(9)aggregate

aggregate先对每个分区的所有元素进行aggregate操作,再对分区的结果进行fold操作。
aggreagate与fold和reduce的不同之处在于,aggregate相当于采用归并的方式进行数据聚集,这种聚集是并行化的。 而在fold和reduce函数的运算过程中,每个分区中需要进行串行处理,每个分区串行计算完结果,结果再按之前的方式进行聚集,并返回最终聚集结果。

图中,通过用户自定义函数对RDD 进行aggregate的聚集操作,图中的每个方框代表一个RDD分区。

源码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
      
/**
* Aggregate the elements of each partition, and then the results for all the partitions, using
* given combine functions and a neutral "zero value". This function can return a different result
* type, U, than the type of this RDD, T. Thus, we need one operation for merging a T into an U
* and one operation for merging two U's, as in scala.TraversableOnce. Both of these functions are
* allowed to modify and return their first argument instead of creating a new U to avoid memory
* allocation.
*/
def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U = {
// Clone the zero value since we will also be serializing it as part of tasks
var jobResult = Utils.clone(zeroValue, sc.env.closureSerializer.newInstance())
val cleanSeqOp = sc.clean(seqOp)
val cleanCombOp = sc.clean(combOp)
val aggregatePartition = (it: Iterator[T]) => it.aggregate(zeroValue)(cleanSeqOp, cleanCombOp)
val mergeResult = (index: Int, taskResult: U) => jobResult = combOp(jobResult, taskResult)
sc.runJob( this, aggregatePartition, mergeResult)
jobResult
}

转载请注明作者Jason Ding及其出处
GitCafe博客主页(http://jasonding1354.gitcafe.io/)
Github博客主页(http://jasonding1354.github.io/)
优快云博客(http://blog.youkuaiyun.com/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354进入我的博客主页

转载请注明作者Jason Ding及其出处
GitCafe博客主页(http://jasonding1354.gitcafe.io/)
Github博客主页(http://jasonding1354.github.io/)
优快云博客(http://blog.youkuaiyun.com/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354进入我的博客主页


转自:http://jasonding1354.github.io/2015/07/12/Spark/%E3%80%90Spark%E3%80%91RDD%E6%93%8D%E4%BD%9C%E8%AF%A6%E8%A7%A34%E2%80%94%E2%80%94Action%E7%AE%97%E5%AD%90/

Spark(4)RDD编程中的transformation算子和action算子使用与区别详解 前言 在上一篇文章中我们介绍了什么是RDD,以及RDD的属性、特征、依赖关系和缓存机制等等: Spark(3)架构原理、运行流程、RDD 那么,本文继续重点介绍一下RDD两类算子的使用。 一、编程模型 在Spark中,RDD被表示为对象,通过对象上的方法调用来对RDD进行转换。经过一系列的transformations定义RDD之后,就可以调用actions触发RDD的计算,action可以是向应用程序返回结果(count, collect等),或者是向存储系统保存数据(saveAsTextFil 阅读详情

相关推荐

大数据——Spark RDD常用算子总结

Spark的核心是建立在同一的抽象弹性分布式数据集(Resilient Distributed Datasets,RDD)之上的,这使得Spark的各个组件可以无缝的进行集成,能够在同一个应用程序中完成大数据处理 1.RDD基本概念 RDD是spark提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的节点上,以函数式操作集合的方式进行各种并行操作 可以将RDD理解为一个分布式对象集合,本质上是一个只读的分区记录集合。每个RDD可以分成多个分区,每个分区就是一个数据集片段。一个R

Vicky_Tang 1万+

Spark常用的Action算子

action算子简介 Action类算子也是一类算子(函数)叫做行动算子,如foreach,collect,count等。Transformations类算子是延迟执行,Action类算子是触发执行。一个application应用程序(就是我们编写的一个应用程序)中有几个Action类算子执行,就有几个job运行。 1.reduce(func)案例 作用:通过func函数聚集RDD中的所有元...

Li_Jian_Hui_的博客 7483

RDD算子介绍

一、RDD算子简介 提供一优秀RDD讲解链接:https://blog.youkuaiyun.com/fortuna_i/article/details/81170565 spark在运行过程中通过算子对RDD进行计算,算子是RDD中定义的函数,可以对RDD中数据进行转换和操作,如下图 输入:spark程序中数据从外部数据空间输入到spark中的数据块,通过BlockManager进行管理 运行:...

fengfengchen95的博客 3801

【Spark篇】---Spark中Action算子

一、前述Action类算子也是一类算子(函数)叫做行动算子,如foreach,collect,count等。Transformations类算子是延迟执行,Action类算子是触发执行。一个application应用程序(就是我们编写的一个应用程序)中有几个Action类算子执行,就有几个job运行。二、具体 原始数据集:  1、count返回数据集中的元素数。会在结果计算完成后回收到Driver...

L先生AI课堂 2759

Spark RDD简介以及算子使用大全

一、spark RDD(1)RDD简介RDD(Resilient Distributed Datasets),弹性分布式数据集,是分布式内存的一个抽象概念。RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。RDD具备像MapReduce等数据流模型的容错特性,并且允许开发人员在大型集群上执行基于内存的计算。RDD是只读的、分区记录的集合。RDD只能基于在稳定物理存储

Sheenky的博客 1539

别再为3D抓取发愁了!Halcon手眼标定保姆级教程(Eye-to-Hand模式,含完整代码)

本文提供Halcon手眼标定的保姆级教程,详细讲解Eye-to-Hand模式下的3D抓取实现方法。从硬件配置、坐标系系统到标定流程和核心算法,涵盖完整代码和实战经验,帮助用户快速掌握工业自动化中的精准抓取技术。

weixin_42523711的博客 270

spark Action 行动算子

spark Action 行动算子

qq_43192537的博客 790

RNA-Seq数据分析实战:从FastQC到STAR比对的完整流程(附避坑指南)

本文提供了RNA-Seq数据分析从FastQC质控到STAR比对的完整实战流程与避坑指南。详细解读了FastQC/MultiQC报告的关键指标,并重点阐述了STAR比对工具的核心参数设置、索引构建及性能优化策略,旨在帮助用户获得准确可靠的比对结果,为下游基因表达分析奠定坚实基础。

weixin_29290259的博客 92

Spark算子

RDD的方法和Scala集合对象的方法不一样,集合对象的方法都是在同一个节点的内存中完成的。RDD的方法可以将计算逻辑发送到Executor端(分布式节点)执行。为了区分不同的处理效果,所以将RDD的方法称为算子,RDD的方法外部的操作都是在Driver端执行的,而方法内部的逻辑代码是在Executor端执行。Spark算子大致可以分为4类:创建算子、转换算子、缓存算子、行动算子。............

weixin_44328257的博客 2568

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。

haoxingheng的专栏 1445

保姆级教程:用Ansible 2.9自动化配置华为ENSP路由器(附Cloud连接避坑指南)

本文提供了一份详细的Ansible 2.9与华为ENSP路由器自动化配置教程,涵盖环境搭建、网络连通性配置、Playbook开发及典型问题排查。特别针对Cloud连接常见问题提供避坑指南,帮助运维工程师快速掌握网络自动化技能,提升工作效率。

weixin_42561476的博客 375

Spark常用RDD算子:transformation转换算子以及action触发算子

transformation 转换算子对RDD数据进行转化得到新的RDD,定义了一个线程任务。常见:map、filter、flatMap、reduceByKey、groupByKey、sortByKeyaction 执行算子触发计算任务,让计算任务进行执行,得到结果。触发线程执行的。常见:foreach、first、count、reduce、saveAsTextFile、collect、take。

m0_70882914的博客 2231

EXI编解码避坑指南:ISO15118-2协议中3条异常命令的差异分析

本文深度剖析了ISO15118-2协议测试中EXI编解码的典型问题,聚焦于ChargeParameterDiscoveryRes、CertificateInstallationReq和MeteringReceiptReq三条命令在不同工具间产生109字节差异的现象。通过对比EXICodec.jar、OpenEXI和Efficient XML的输出,揭示了差异根源于EXI报头处理机制与模式文件完整性,并提供了从现象确认、根因分析到解决方案的标准化排查流程,助力协议测试工程师确保编解码一致性与通信可靠性。

algae的博客 411

spark_rdd算子介绍

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。

HYSliuliuliu的博客 8020

【Zephyr存储专题】06_存储块设备驱动开发(Nand Flash)

本文介绍了基于Zephyr系统的NAND Flash驱动实现方案,重点阐述了Flash驱动模型的核心架构和关键API设计。

zero的博客 1802

Matlab 曲面平滑与点云处理

曲面平滑是一种常见的数学和计算机图形学技术,可以用来消除噪声、填补数据间隙,以及改善曲面的外观。在点云处理中,曲面平滑也被广泛应用于重建、拟合和可视化等领域。本文将介绍如何使用 Matlab 进行曲面平滑和点云处理,并提供相应的源代码。通过以上步骤,我们可以使用 Matlab 进行曲面平滑和点云处理。你可以根据具体需求调整参数和算法,以获得理想的曲面平滑效果。接下来,我们可以使用平滑算法对三角化的网格进行曲面平滑。以上代码将绘制原始点云和重建后的点云,并在图形中显示坐标轴和图例。表示平滑的迭代次数。

QfcaLinux的博客 752

Spark:RDD简介及基础算子

本文主要介绍Spark Core的核心内容:RDD。包含以下章节和对应的内容 章节 内容 1 RDD简介 2 RDD分区 3 RDD的依赖关系 4 RDD的缓存机制和区别 5 RDD创建的两种方式 6 RDD算子和总结 7 RDD 算子操作案例 1、RDD简介 RDD(Resilient Distribute...

yilulvxing的博客 6033

Arduino、ESP32驱动SFA40甲醛传感器(气体传感器篇)

SFA40甲醛传感器是一款基于盛思锐电化学原理的专业HCHO检测模块,具备卓越的抗酒精干扰能力(乙醇交叉敏感度<0.3%)、高达±20ppb的检测精度及0~1000ppb的宽量程。该传感器内置SHT4X温湿度传感器进行自动补偿,确保数据的长期稳定性;其小尺寸、低功耗的特性,可快速集成至智能家居、空气净化器、物联网环境监测等系统中,实现对甲醛浓度的精准、可靠监测。

不脱发的程序猿 302

Spark常见算子详解

groupByKey 和groupby 的区别是前者是确定以key为分组,所以只返回value的迭代器,程序上后者不确定以什么来分组,所以返回[(String,Int) (K,V)]定义:countByKey算子统计K-v类型的数据中的Key的次数,countByValue统计所有的value出现的次数,统计对象可以是K-v,也可以是List等。定义:rdd.aggregateByKey((初始化的值)(分区内迭代计算的逻辑)(分区间计算的逻辑))

weixin_42733117的博客 3070

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spark之RDD动作算子(Action)大全

前面已经给大家讲过RDD原理以及常用的转换算子,今天就再给大家说说RDD的动作算子有哪些,以便大家更能全面的理解和掌握。 对于动作算子来说,本质上动作算子是通过SparkContext执行提交作业操作,触发RDD DAG(有向无环图)的执行;所有的动作算子都是急迫型(non-lazy),RDD遇到Action就会立即计算。 常用动作算子 count 返回数据集中的元素的个数 案例: val rdd=sc.parallelize(List(1,2,3,4,5,6)) rdd.count //6 coll

zp17834994071的博客 5509

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spark03-RDD02-常用的Action算子

常用的action算子

qq_31532983的博客 1394

spark中RDD算子分类整理

一、transaction算子/action算子 spark的算子可以分为transaction算子以及action算子,变换/转换算子,这种变换并不触发提交作业,完成作业中间过程处理。就是transaction算子,相反执行这个RDD时会触发 SparkContext 提交 Job 作业,那么它就是action算子。transaction算子会懒执行,action会立即执行当前算子以及当前算子...

yrsg666的博客 7751

Spark算子简介及实例【Transformation算子和Action算子】

Spark的算子主要分为两大类:Transformation(转换)算子和Action(动作)算子。

weixin_44241184的博客 1388

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

常用transformation及action介绍一、常用transformation介绍1.1 transformation操作实例二、常用action介绍 一、常用transformation介绍 操作 介绍 map 将RDD中的每个元素传入自定义函数,获取一个新的元素,然后用新的元素组成新的RDD filter 对RDD中每个元素进行判断,如果返回true则保留,返回fa...

爱是与世界平行 1965

Spark基础之:常用算子逐一详解

Spark常用算子逐一详解 一、什么是Spark rdd算子 二、算子的分类 三、常用的Transformation算子及使用方法 四、常用的Action算子及使用方法 五、关于rdd算子的常见问题汇总

weixin_43542605的博客 6638
上一篇: 脚本手动执行无误,crontab自动执行出错
下一篇: find和grep命令实例
heming621
博客等级 码龄15年 9粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值