Spark的Action执行、 Transformation转换、Controller控制三种操作类型的使用

本文通过WordCount详解过程图探讨Spark运行过程,介绍了RDD的三种操作类型,包括进行数据状态转换的Transformation、触发具体作业取结果的Action,以及对性能效率和容错支持的Controller,并给出了各操作类型的多个示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过WordCount详解过程图,观察Spark的运行过程,思考RDD操作类型有几种?有了初步的思考,下文会给出RDD操作类型区别和实战演示

Q1:RDD 的操作有几种 ?

有如下三种:

(1)transformation:进行数据状态的转换,对已有的RDD创建新的RDD。

(2)Action:触发具体的作业,对RDD最后取结果的一种操作

(3)Controller:对性能效率和容错方面的支持。persist , cache, checkpoint

1. Transformation:进行数据状态的转换,对已有的RDD创建新的RDD。

例如:
(1)map(func) :返回一个新的分布式数据集,由每个原元素经过func函数转换后组成
(2)filter(func) : 返回一个新的数据集,由经过func函数后返回值为true的原元素组成 
(3)flatMap(func) : 类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素)
(4)sample(withReplacement, frac, seed) : 根据给定的随机种子seed,随机抽样出数量为frac的数据
(5)union(otherDataset) : 返回一个新的数据集,由原数据集和参数联合而成
(6)groupByKey([numTasks]) : 在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。注意:默认情况下,使用8个并行任务进行分组,你可以传入numTask可选参数,根据数据量设置不同数目的Task
(7)reduceByKey(func, [numTasks]) : 在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。和groupbykey类似,任务的个数是可以通过第二个可选参数来配置的。
(8)join(otherDataset, [numTasks]) : 在类型为(K,V)和(K,W)类型的数据集上调用,返回一个(K,(V,W))对,每个key中的所有元素都在一起的数据集
(9)groupWith(otherDataset, [numTasks]) : 在类型为(K,V)和(K,W)类型的数据集上调用,返回一个数据集,组成元素为(K, Seq[V], Seq[W]) Tuples。这个操作在其它框架,称为CoGroup
(10)cartesian(otherDataset) : 笛卡尔积。但在数据集T和U上调用时,返回一个(T,U)对的数据集,所有元素交互进行笛卡尔积。

2. Action:触发具体的作业,对RDD最后取结果的一种操作。

例如:
(1)reduce(func):通过函数func先聚集各分区的数据集,再聚集分区之间的数据,func接收两个参数,返回一个新值,新值再做为参数继续传递给函数func,直到最后一个元素
(2)collect():以数据的形式返回数据集中的所有元素给Driver程序,为防止Driver程序内存溢出,一般要控制返回的数据集大小
(3)count():返回数据集元素个数
(4)first():返回数据集的第一个元素
(5)take(n):以数组的形式返回数据集上的前n个元素
(6)top(n):按默认或者指定的排序规则返回前n个元素,默认按降序输出 
(7)takeOrdered(n,[ordering]): 按自然顺序或者指定的排序规则返回前n个元素

(8)saveAsTextFile()

Spark action级别的操作,特点是内部都调用runJob方法,常用的action:reduce(1+2+3+4—-》1+2=3+3=6+4=10),aggregate,collection(把所有的结果放在driver上),count执行结果有多少条,take获取执行结果的某几条,saveAsTextFile把执行结果保存在Hadoop支持的文件系统上,foreach循环每一条元素;countByKey:可看一个key有多少个value;

注意:reduceByKey不是action,它是一个transformation

action级别操作举例:


val numbers = sc.parallelize(1 to 100)

scala> numbers.reduce(_+_) 触发作业

val result = numbers.map(2*_)

scala> result.collect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值