1.行动算子介绍
- 返回的不是一个RDD,而是一个数据值或者集合或者是没有返回
- 没有行动算子算法,那么无法实现转换算子的执行
2.reduce(fun):T 聚合算子
- 定义:fun函数类型如下 (T,T)=>T T是RDD的数据集数据的类型
将原先RDD数据集中聚合起来算一个总的结果 sum/count/
- 解释:reduce算子是对RDD数据集中每一个数据都要进行聚合操作
- 案例:
| def reduceOper(sc: SparkContext): Unit ={ |
| val rdd = sc.makeRDD(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)) |
| |
| |
| val sum: Int = rdd.reduce((a: Int, b: Int) => { |
| println(s"a=$a, b=$b") |
| a+b |
| }) |
| println(rdd.getNumPartitions) |
| println(sum) |
| |
| |
| val max: Int = rdd.reduce((a: Int, b: Int) => { |
| println(s"a=$a, b=$b") |
| if (a > b) { |
| a |
| } else { |
| b |
| } |
| }) |
| println(rdd.getNumPartitions) |
| println(max) |
| |
| |
| val min: Int = rdd.reduce((a: Int, b: Int) => { |
| println(s"a=$a, b=$b") |
| if (a < b) { |
| a |
| } else { |
| b |
| } |
| }) |
| println(rdd.getNumPartitions) |
| println(min) |
| } |
3.aggregate 聚合算子,属于一种柯里化应用类型的算子
- 定义:aggregate (zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U):U
zeroValue 初始值
seqOp函数 对RDD数据集中的每一个分区和zeroValue取一个聚合操作 得到一个结果
combOp函数 将每个分区通过seqOp函数计算出来的结果和zeroValue聚合操作得到一个最终结果
- 解释:聚合算子,属于一种柯里化应用类型的算子
- 案例:
| def aggregateIOper(sc:SparkContext):Unit={ |
| val rdd:RDD[Int] = sc.makeRDD(Array(12,456,413,458,85,2,15,6,3),4); |
| |
| |
| val res:Int = rdd.aggregate(1)( |
| |
| |
| |
| |
| |
| (a: Int, b: Int) => { |
| a + b |
| }, |
| |
| |
| |
| |
| |
| (a: Int, b: Int) => { |
| a + b |
| } |
| ) |
| println("sum值:" + res) |
| |
| |
| val min = rdd.aggregate(rdd.first())( |
| (a: Int, b: Int) => { |
| if (a < b) { |
| a |
| } else { |
| b |
| } |
| }, |
| (a: Int, b: Int) => { |
| if (a < b) { |
| a |
| } else { |
| b |
| } |
| } |
| ) |
| println("最小值:" + min) |
| } |
4. collect():Array[T] -----慎用
- 定义:将RDD数据集中的全部数据拉取到Driver所在节点形成一个数组,数组包含RDD数据集中的所有数据,数组内存中的概念
- 案例:
| def collectOper(sc: SparkContext):Unit={ |
| val rdd = sc.makeRDD(Array(20,30,11,15,16,19,22,26,17,45,54,99)) |
| val array:Array[Int] = rdd.collect() |
| println(array.mkString(",")) |
| } |
5. count():Long 求总数
| def countOper(sc: SparkContext):Unit={ |
| val rdd = sc.makeRDD(1 to 100) |
| val count = rdd.count() |
| println(count) |
| } |
6.saveAsTextFile(path)数值型RDD专用
- 解释:将rdd计算出来的结果集保存到本地或者是HDFS分布式文件存储系统
- 案例:
| def saveAsXXXOper(sc: SparkContext):Unit={ |
| val rdd = sc.makeRDD(1 to 100) |
| rdd.saveAsTextFile("hdfs://node1:9000/action") |
| } |
7.take(n) takeSample(true/false,num)
| def take(sc: SparkContext) = { |
| val rdd = sc.makeRDD(1 to 100) |
| |
| val first: Int = rdd.first() |
| println(first) |
| |
| val take: Array[Int] = rdd.take(3) |
| |
| println(take.mkString(",")) |
| |
| |
| val takeSample: Array[Int] = rdd.takeSample(true, 2) |
| println(takeSample.mkString("=")) |
| |
| |
| val value = sc.makeRDD(Array(2324, 122, 34, 324, 12, 2)) |
| var takeorder = value.takeOrdered(3) |
| println(takeorder.mkString("-")) |
| } |
8.foreach函数
| foreach(func) 无返回值 一般用于累加器计算或者RDD数据集的遍历操作 |
| func函数无返回值类型的函数 |
9.整数型RDD特有的统计操作----行动算子
| object CountRDD { |
| def main(args: Array[String]): Unit = { |
| val sparkConf:SparkConf = new SparkConf().setAppName("zhengshu").setMaster("local") |
| val sc:SparkContext = new SparkContext(sparkConf) |
| val rdd:RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5, 6, 7, 8)) |
| val rdd1:RDD[String] = sc.makeRDD(Array("zs","ls","ww")) |
| println(s"rdd的累加和${rdd.sum()}") |
| println(s"rdd的最大值${rdd.max()}") |
| println(s"rdd的累最小值${rdd.min()}") |
| println(s"rdd的平均值${rdd.mean()}") |
| println(s"rdd的方差${rdd.variance()}") |
| println(s"rdd的标准差${rdd.stdev()}") |
| sc.stop() |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?