Spark 行动算子

news2025/2/21 23:28:13

文章目录

  • Spark 行动算子
      • 1、reduce
      • 2、collect
      • 3、count
      • 4、first
      • 5、take
      • 6、takeOrdered
      • 7、代码示例
      • 8、aggregate
      • 9、fold
      • 10、countByValue & countByKey (wordcount重点)

Spark 行动算子

所谓的行动算子,其实就是触发作业执行的方法,之前的转换算子是不能直接触发执行的,形成了一个个新的RDD。行动算子比较少,就那么几个。
注意
因为行动算子是直接触发执行的,并不是返回RDD,所以不能使用collect()方法,得使用println()打印到控制台

1、reduce

聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据。

package com.atguigu.bigdata.spark.core.wc.action

import org.apache.spark.{SparkConf, SparkContext}

// RDD 行动算子 reduce:聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据。
class Spark02_RDD_reduce {

}
object Spark02_RDD_reduce{
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("RDD行动算子")
    val context = new SparkContext(conf)
    val rdd = context.makeRDD(List(1, 2, 3, 4))
    val reduceRDD = rdd.reduce(_ + _) //reduce 先进行分区内聚合,再分区间聚合
    println(reduceRDD)
    context.stop()
  }
}

2、collect

方法会将不同分区的数据按照分区顺序采集到Driver端内存中,形成数组

3、count

统计数组源中数据的个数

4、first

获取数据源中的第一个元素

5、take

返回一个由RDD的前n个元素组成的数组

6、takeOrdered

返回该RDD排序后的前n个元素组成的数据,这个方法很不错,还可以直接排序

7、代码示例

前面几个方法比较简单,所以把他们放一起了。

package com.atguigu.bigdata.spark.core.wc.action

import org.apache.spark.{SparkConf, SparkContext}

// RDD 行动算子 reduce:聚集RDD中的所有元素,先聚合分区内数据,再聚合分区间数据。
class Spark02_RDD_reduce {

}
object Spark02_RDD_reduce{
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("RDD行动算子")
    val context = new SparkContext(conf)
    val rdd = context.makeRDD(List(1, 2, 3, 5,4))
    //reduce:先进行分区内聚合,再分区间聚合
    val reduceRDD = rdd.reduce(_ + _)
    println(reduceRDD)
    //collect:方法会将不同分区的数据按照分区顺序采集到Driver端内存中,形成数组
//    val ints = rdd.collect()
//    println(ints)
    // count:数组源中数据的个数
    val count = rdd.count()
    println(count)

    // first:获取数据源中的第一个元素
    val i = rdd.first()
    println(i)

    //take:返回一个由RDD的前n个元素组成的数组
    val ints = rdd.take(3)
    println(ints.mkString(","))

    //takeOrdered:数据排序后取前n个数据
    val ints1 = rdd.takeOrdered(4)
    println(ints1.mkString(","))
    
    context.stop()
  }
}

8、aggregate

分区的数据通过初始值和分区内的数据进行聚合,然后再和初始值进行分区间的数据聚合
val result = rdd.aggregate(0)(_ + _,_+ _) //初始值,分区内计算,分区间计算。
注意
aggregateaggregateByKey 的区别:
aggregateByKey 初始值只参与分区内计算
aggregate 初始值参与内区内计算,并且和参与分区间计算

package com.atguigu.bigdata.spark.core.wc.action

import org.apache.spark.{SparkConf, SparkContext}

//aggregate:分区的数据通过`初始值`和分区内的数据进行聚合,然后再和初始值进行分区间的数据聚合
class Spark03_RDD_aggregate {

}
object Spark03_RDD_aggregate{
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("RDD行动算子")
    val context = new SparkContext(conf)
    val rdd = context.makeRDD(List(1, 2, 3, 4))
    //TODO -行动算子 aggregate
    //aggregateByKey 是转换算子  aggregate 是行动算子
    // aggregateByKey:初始值只会参与分区内计算
    // aggregate : 初始值会参与内区内计算,并且和参与分区间计算
    val i = rdd.aggregate(10)(_ + _, _ + _)
    println(i)

    context.stop()

  }
}

9、fold

aggregate 的简化版本,只是分区内操作和分区间操作是一样的,可以减少一些。
val result = rdd.fold(0)(_ + _) //前面是初始值,后面是分区内和分区间的计算规则

10、countByValue & countByKey (wordcount重点)

这个方法特别特别好用,做wordcount直接这一个方法就出来了。
countByKey 需要键值对类型的集合,根据key来统计。countByValue 直接普通的集合就可以了,根据value,这里的value不是键值对里面那个value,是单值的意思。
在这里插入图片描述
在这里插入图片描述

package com.atguigu.bigdata.spark.core.wc.action

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

class Spark04_countByKey {

}
object Spark04_countByKey{
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("RDD行动算子")
    val context = new SparkContext(conf)
    val rdd = context.makeRDD(List(1, 2, 3, 4,2,2,3))
    val rdd2: RDD[String] = context.makeRDD(List("word", "word", "scala", "spark"))
    val rdd3 = context.makeRDD(List(("a",1),("a",2),("b",1),("c",2))) //统计的是出现的次数不是value

    //countByValue() 根据单值来统计
    val intToLong: collection.Map[Int, Long] = rdd.countByValue()
    val stringToLong: collection.Map[String, Long] = rdd2.countByValue()

    // countByKey() 根据key来统计
    val stringToLong1 = rdd3.countByKey()
    //println(intToLong) //返回的是一个Map ,Map可以直接输出,还默认就调用了collect方法
    println(stringToLong)
    println(stringToLong1)
    context.stop()
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lua 模块与包

Lua 模块与包 参考至菜鸟教程。 模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。 Lua…

一起自学SLAM算法:11.3 路径规划

连载文章,长期更新,欢迎关注: 路径规划其实就是在回答图11-1中机器人提出的第3个问题“我该如何去”,不管是在已知地图上导航或是在未知环境下通过一边探索地图一边导航,路径规划其实就是在地图上寻找到一条从起点到目…

CMMI3-5级如何高效落地?——CMMI落地4大工具

为了助力CMMI3-5级高效落地,近日CoCode旗下Co-ProjectV3.0智能项目管理平台全面升级,CMMI落地4大工具正式上线:CMMI成熟度自测工具、量化管理工具(组织级过程改进工具和量化项目管理工具)、组织级过程资产库。 01、CMM…

年后创业,该如何选择适合年轻人的小成本创业项目?

2023年创业大潮即将来袭,疫情政策的放开,会让越来越多的年轻人选择创业。单纯的工作已经不能满足年轻人的生活需求,那无经验、无人脉的年轻人该如何选择适合自己的创业项目?小编在这里总结了几点,适合年轻人的小成本项…

Android Kotlin 多线程编程 server

参考: 《第一行代码 第三版》 10.1 service 是什么 Service是实现程序后台运行的解决方案,适合执行非交互,后台预先的任务,即使用户打开其他应用,Service也能够正常运行 Service需要内部手动创建子线程 10.2 多线程编程 用法&a…

Makefile学习⑨:Makefile中的等号和shell命令的使用

Makefile学习⑨:Makefile中的等号和shell命令的使用 Makefile中的等号 “” 普通赋值符号,命令格式如下 变量值注意:变量的最终值为该文件中的最后进行赋值操作所赋的值。 (不管在当前文件的何处进行赋值,在使用该…

【MySQL】MySQL经常使用时间日期相关函数

MySQL经常使用时间、日期相关函数 MySQL经常使用的时间、日期相关函数 1. 日期函数 显示当前日期函数:CURDATE(), CURRENT_DATE(), CURRENT_DATE SQL:select CURDATE(), CURRENT_DATE(), CURRENT_DATE from dual; 2. 时间函数 显示当前日期函数&…

Mysql专栏(五) Mysql高可用

Mysql专栏收尾之作,作为一名后端开发人员,对于Mysql的知识了解到这里已经足以应对99的场景了,毕竟没有必要非要跟DBA抢活儿干。 而且现在的趋势都是往云上走,云数据库已经帮我们处理了高可用和数据一致性的事情了,所以…

初阶指针的介绍

文章目录 指针是什么 指针和指针类型 野指针 指针运算 指针和数组 二级指针 指针数组 一、 指针是什么 指针理解的2个要点: 1. 指针是内存中一个最小单元的编号,也就是地址 2. 平时口语中说的指针,通常指的是指针变量,是用…

达梦8数据库优化

1.什么是执行计划? 一条SQL语句在数据库中执行过程或访问路径的描述。 2.如何查看达梦数据库执行计划? 通过explain命令: EXPLAIN 执行的SQL语句,如 SQL> EXPLAIN SELECT * FROM TEST1; 1 #NSET2: [1, 1113, 602] 2 …

Vue笔记01 模板语法,数据代理,事件处理,计算监听属性,绑定样式,列表渲染,数据监测

基本使用 引入vue 创建vue实例并关联容器 一个Vue实例只应对应一个容器 一个Vue实例可以有多个组件 模板语法 使用Vue实例中数据 root容器中代码被称为vue模板 语法分为插值语法和指令(v-xxx) 插值语法 绑定标签体内容 {{}}中的可以是js表达式(特殊的js代码&…

CF790 div4 F(双指针) H(逆序对)

乐,被div4薄纱了没想到把所有出现次数>k的数放一个数组里然后双指针还有H,连逆序对都没看出来,嘻感觉以后还是写写div4算了,写什么div2啊,caibiProblem - F - Codeforces题意:给定一个数列,长…

2023万象更新!smardaten企业级无代码新版本也来啦!

2022可以说是在反复的做核酸、查绿码中度过的,不曾想年终一个月还是躲不过“小阳人”的命运。而这一个月,研发部的“阳过”们依旧加班加点给我们带来了最新版本——V8R4C70。在2022-2023跨年之际,smardaten这次又有哪些新的变化呢&#xff0c…

MVC三层架构的模式

大家好,今天给大家分享一下MVC 三层架构的模式 首先你要知道,所谓的MVC就是一种面向于javaee企业级开发的设计模式 这里要强调一点,MVC 不是一种技术,不是一种像spring 那样的框架,它是一种思想(可以理解为一种解决问…

【GNSS算法工程入门】1. Git入门

写在前面笔者在GNSS算法开发岗位从业过一段时间,和大部分同学类似,在GNSS开发过程中,也是从工程化的小白逐渐成长起来。而在算法开发从业的过程中,发现有些基础的知识其实在学校学习过程中是相对缺失的。麻省理工有个课程叫计算机…

编译型语言的Docker镜像构建小技巧

最近公司需要将一个底层服务打包成docker镜像,作为征战docker一年的小白当然不能错过这次练手的好机会。简单介绍一下这个项目:该项目为一个纯restful风格的后端项目,后端由java开发、worker节点由python开发、管理员使用的命令行工具由rust开…

wpa_supplicant EAP状态机分析

EAP状态机分析RFC4137协议状态机设计原理模块划分SM状态定义SM状态转换SM使用到的变量及函数定义变量1.SM与LL交互使用到的变量列表2.SM与EM交互使用到的变量3.SM内部使用的变量函数wpas代码RFC4137协议 RFC4137:“State Machine for Extensible Authentication Pr…

强化学习笔记-01多臂老虎机问题

本文是博主对《Reinforcement Learning- An introduction》的阅读笔记,不涉及内容的翻译,主要为个人的理解和思考。 1. 多臂老虎机问题 多臂老虎机问题是指存在K个老虎机,每个老虎机的获胜金额是一个未知的概率分布且相互独立,假设…

一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子

Opencv四大算子 Sobel算子Scharr算子laplacian算子canny算子总结边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要的作用! Sobel算子 sobel算子对图像求一阶导数。一阶导数越大,说明像素在该方向的变化越大,边缘信号越…

python链接池和pymysql批量入库——从0实现大规模异步爬虫框架项目4

我将这个链接池和批量入库封装了一个工具类上传了pypi,可以直接import使用 使用也较为简单,导入PooledDBhelper的DBhelper,调用DBhelper.PooledDBhelper()方法传入数据库链接信息创建一个链接池即可 pip install PooledDBhelper1.0.0 -----------------…