RDD 专项练习

RDD 专项练习

现有分数信息文件 scores.txt

班级ID 姓名 年龄 性别 科目 成绩
12 张三 25 男 chinese 50
12 张三 25 男 math 60
12 张三 25 男 english 70
12 李四 20 男 chinese 50
12 李四 20 男 math 50
12 李四 20 男 english 50
12 王芳 19 女 chinese 70
12 王芳 19 女 math 70
12 王芳 19 女 english 70
13 张大三 25 男 chinese 60
13 张大三 25 男 math 60
13 张大三 25 男 english 70
13 李大四 20 男 chinese 50
13 李大四 20 男 math 60
13 李大四 20 男 english 50
13 王小芳 19 女 chinese 70
13 王小芳 19 女 math 80
13 王小芳 19 女 english 70
需求如下:
1、一共有多少人参加考试?
2、一共有多少个大于、小于、等于20岁的人参加考试?
3、分别有多个男生和女生参加考试?
4、各个班有多少人参加考试?
5、语文和数学科目的平均成绩是多少?
6、单个人平均成绩是多少?
7、各班平均成绩是多少?
8、各班男女生平均总成绩是多少?
9、全校语文成绩最高分是多少?
10、各班各个科目最高和最低成绩是多少?
11、总成绩大于 150 分的 12 班的女生有几个?

一、预处理

定义一个内部case类用于存储分数数据
创建SparkContext对象
读取数据文件,跳过第一行(标题行),并映射为Score对象(附加年龄类型)

import org.apache.spark.rdd.RDD  
import org.apache.spark.{SparkConf, SparkContext}  object SparkRDD {  // 定义一个内部case类用于存储分数数据  private case class Score(classId: Int, name: String, age: Int, gender: String, subject: String, score: Int, _type: String)  def main(args: Array[String]): Unit = {  // 创建Spark配置对象  val conf = new SparkConf()  .setAppName("spark_rdd") // 设置应用名称  .setMaster("local[4]") // 设置运行模式为本地模式,并分配4个核心  // 获取或创建SparkContext对象  val sc = SparkContext.getOrCreate(conf)  // 指定数据文件路径  val path = "file:///D:\\myOwnProject\\spark_first\\data\\scores.txt"  // 读取数据文件,跳过第一行(标题行),并映射为Score对象  val scores: RDD[Score] = sc.textFile(path, 4) // 读取文件,分区数为4  .mapPartitionsWithIndex { // 对每个分区应用索引和迭代器  case (index, iterator) => if (index == 0) iterator.drop(1) else iterator // 如果是第一个分区,则跳过第一行  }  .mapPartitions( // 对每个分区应用映射操作  _.map(line => { // 对分区中的每一行进行处理  val a = line.split("\\s+") // 按空白字符分割每行  val age = a(2).toInt // 将年龄字段转换为整数  val _type = age match { // 根据年龄设置类型  case age if age > 20 => "GT20" // 年龄大于20  case age if age == 20 => "EQ20" // 年龄等于20  case age if age < 20 => "LT20" // 年龄小于20  }  // 构造Score对象  Score(a(0).toInt, a(1), a(2).toInt, a(3), a(4), a(5).toInt, _type)  })  ).cache() // 将RDD缓存到内存中,优化:RDD结果被不断使用// 打印所有处理后的Score对象  scores.foreach(println)  //程序结束时停止SparkContext  sc.stop()  }  
}

二、处理需求

1、一共有多少人参加考试?

val count1 = scores.mapPartitions(_.map(_.name))	// scores如上预处理,下同.distinct().count()println(s"${count1} 人参加考试")			//6人参加考试

2、一共有多少个大于、小于、等于20岁的人参加考试?

val map = Map(("GT20", "20岁以上"), ("EQ20", "20岁"), ("LT20", "20岁以下"))
scores.mapPartitions(_.map(s => ((s.name, s._type), 1))).groupByKey().mapPartitions(_.map(s => (s._1._2, 1))).reduceByKey(_ + _).foreach(s => println(s"${map.get(s._1).get}的人数为${s._2}"))
/*
20岁以上的人数为2
20岁以下的人数为2
20岁的人数为2
*/

3、分别有多个男生和女生参加考试?

scores.mapPartitions(_.map(s => ((s.name, s.gender), 1))).groupByKey().mapPartitions(_.map(s => (s._1._2, 1))).reduceByKey(_ + _).foreach(s => println(s"${s._1}生参加考试的人数为${s._2}"))
/*
男生参加考试的人数为4
女生参加考试的人数为2
*/

4、各个班有多少人参加考试?

注意同班,同名去重

方法一:groupByKey 去重

scores.mapPartitions(_.map(s => ((s.name, s.classId), 1))).groupByKey().mapPartitions(_.map(s => (s._1._2, 1))).reduceByKey(_ + _).foreach(s => println(s"${s._1}班参加考试的人数为${s._2}"))
/*
12班参加考试的人数为3
13班参加考试的人数为3
*/

方法二:distinct去重(不推荐)

scores.mapPartitions(_.map(t=>(t.classId, t.name))).distinct().map(s => (s._1, 1)).reduceByKey(_+_).foreach(s => println(s"${s._1}班参加考试的人数为${s._2}"))

5、语文数学科目的平均成绩是多少?

scores.mapPartitions(_.collect({	 	// 存在非语数外科目,如何过滤case s if s.subject.matches("chinese|math") => (s.subject, s.score)})).groupByKey().map(t => (t._1, t._2.sum * 1.0f / t._2.size)).foreach(s => println(s"${s._1}平均分:${s._2}"))

6、单个人平均成绩是多少?

scores.mapPartitions(_.map(t=>(t.name,t.score))).groupByKey().map(t=>(t._1,t._2.sum*1.0f/t._2.size)).foreach(println)

7、各班平均成绩是多少?

scores.mapPartitions(_.map(t=>(t.classId,t.score))).groupByKey().map(t=>(t._1,t._2.sum*1.0f/t._2.size)).foreach(println)

8、各班男女生平均总成绩是多少?

scores.mapPartitions(_.map(t=>((t.classId,t.gender),t.score))).groupByKey().map(t=>(t._1,t._2.sum*1.0f/t._2.size)).foreach(println)

9、全校语文成绩最高分是多少?

val chineseMax = scores.mapPartitions(_.filter(_.subject.equals("chinese")).map(_.score)).max()
println(s"最高语文成绩为${chineseMax}")

10、各班各个科目最高和最低成绩是多少?

scores.mapPartitions(_.map(s => ((s.subject, s.classId), (s.score, s.score)))
)
.reduceByKey((s1, s2) => (if (s1._1 > s2._1) s1._1 else s2._1, (if (s1._2 < s2._2) s1._2 else s2._2))
)
.foreach(s => println(s"${s._1._2}${s._1._1}科目的最大成绩为${s._2._1},最小成绩为${s._2._2}"))

结果

13班chinese科目的最大成绩为70,最小成绩为50
12班english科目的最大成绩为70,最小成绩为50
12班chinese科目的最大成绩为70,最小成绩为50
13班english科目的最大成绩为70,最小成绩为50
12班math科目的最大成绩为70,最小成绩为50
13班math科目的最大成绩为80,最小成绩为60

11、总成绩大于 150 分的 12 班的女生有几个?

val count2 = scores.mapPartitions(_.filter(s => s.gender == "女" && s.classId == 12).map(s => (s.name, s.score))).reduceByKey(_ + _).filter(s => s._2 > 150).count()
println(s"总成绩大于 150 分的 12 班的女生有${count2}个")

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

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

相关文章

FPGA-Verilog-Vivado-软件使用

这里写目录标题 1 软件配置2 FPGA-7000使用2.1 运行启动方式 1 软件配置 编辑器绑定为Vscode&#xff0c;粘贴VS code运行文件的目录&#xff0c;后缀参数保持不变&#xff1a; 如&#xff1a; D:/Users/xdwu/AppData/Local/Programs/Microsoft VS Code/Code.exe [file name]…

从技术到管理:你必须知道的七个转变

在职业生涯的道路上&#xff0c;很多技术骨干会逐步转向管理岗位。这不仅是职位的晋升&#xff0c;更是角色、思维和能力的全方位转变。以下是七个关键的转变&#xff0c;帮助技术人员顺利完成这一跨越。 一、从个人贡献者到团队领导者的转变 在技术岗位上&#xff0c;成功往…

(19)夹钳(用于送货)

文章目录 前言 1 常见的抓手参数 2 参数说明 前言 Copter 支持许多不同的抓取器&#xff0c;这对送货应用和落瓶很有用。 按照下面的链接&#xff08;或侧边栏&#xff09;&#xff0c;根据你的设置了解配置信息。 Electro Permanent Magnet v3 (EPMv3)Electro Permanent M…

bug记录 qInstallMessageHandler的使用

QT (纯C)项目 ‘Qxxx‘ file not found 和 编译报错问题(已解决)_qt头文件file not found-CSDN博客 qInstallMessageHandler&#xff08;指针函数参数&#xff09; 需要静态指针&#xff0c;这个函数 #include <iostream> #include "singleton.h" #include &…

Linux操作系统CentOS如何更换yum镜像源

简介 CentOS&#xff0c;是基于Red Hat Linux提供的可自由使用源代码的企业级Linux发行版本&#xff1b;是一个稳定&#xff0c;可预测&#xff0c;可管理和可复制的免费企业级计算平台。 下载地址: centos安装包下载_开源镜像站-阿里云 相关仓库&#xff1a; CentOS过期源&…

职业教育人工智能实验实训室建设应用案例

随着人工智能技术的快速发展&#xff0c;其在职业教育领域的应用逐渐深入。唯众作为一家专注于教育技术领域的企业&#xff0c;积极响应国家关于人工智能教育的政策号召&#xff0c;通过建设人工智能实验实训室&#xff0c;为学生提供了一个实践操作与创新思维相结合的学习平台…

C++ STL iter_swap用法和实现

一&#xff1a;功能 交换两个迭代器指向的元素值&#xff0c;一般用在模板中 二&#xff1a;使用 #include <vector> #include <iostream>template <typename It, typename Cond>requires std::forward_iterator<It> && std::indirectly_swa…

富格林:曝光纠正安全交易误区

富格林指出&#xff0c;贵金属投资是许多投资者追求资产多样化和风险管理的重要途径。然而&#xff0c;正如任何投资领域一样&#xff0c;不少投资者也对贵金属投资产生了一些误区和错误观念。但事实上&#xff0c;如果这种误区一直伴随着我们的交易进程&#xff0c;是很难做到…

34 超级数据查看器 关联图片

超级数据查看器app&#xff08;excel工具&#xff0c;数据库软件&#xff0c;表格app&#xff09; 关联图片讲解 点击 打开该讲的视频 点击访问app下载页面 豌豆荚 下载地址 大家好&#xff0c;今天我们讲一下超级数据查看器的关联图片功能 这个功能能让表中的每一条信息&…

数据结构-散列表(hash table)

6.1 散列表的概念 散列表又叫哈希&#xff08;hash&#xff09;表&#xff0c;是根据键&#xff08;key&#xff09;直接访问在内存存储位置的值&#xff08;value&#xff09;的数据结构&#xff0c;由数组演化而来&#xff08;根据数组支持按照下标进行随机访问数据的特性&a…

windows脚本获取 svn版本号

简介 需要使用项目中svn的最新版本号 命令 set svnURL"URL" svn info %svnURL% | findstr "Revision:" > Version.txt for /f "token2 delims " %%i in (Version.txt) do set rev%%i echo %rev% pause

力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组)

力扣爆刷第163天之TOP100五连刷81-85&#xff08;回文链表、路径和、最长重复子数组&#xff09; 文章目录 力扣爆刷第163天之TOP100五连刷81-85&#xff08;回文链表、路径和、最长重复子数组&#xff09;一、234. 回文链表二、112. 路径总和三、169. 多数元素四、662. 二叉树…

洛谷 B4006 [GESP202406 四级] 宝箱

题目描述 小杨发现了 &#x1d45b; 个宝箱&#xff0c;其中第 &#x1d456; 个宝箱的价值是 &#x1d44e;&#x1d456;​。 小杨可以选择一些宝箱放入背包并带走&#xff0c;但是小杨的背包比较特殊&#xff0c;假设小杨选择的宝箱中最大价值为 &#x1d465;&#xff0c…

next input代码尝试编写

使用有限状态机&#xff08;FSM&#xff09;可以使代码结构更清晰&#xff0c;特别是处理复杂的状态和过渡时。以下是如何根据你提供的步骤&#xff0c;用有限状态机来实现自动校准和中断触发逻辑的示例代码。 状态定义 IDLE: 空闲状态&#xff0c;等待数据输入。CALIBRATING…

Python高级(三)_正则表达式

Python高级-正则表达式 第三章 正则表达式 在开发中会有大量的字符串处理工作,其中经常会涉及到字符串格式的校验。 1、正则表达式概述 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、…

PostgreSql中的JSON数据类型

PostgreSQL 提供了两种 JSON 数据类型&#xff1a;JSON 以及 JSONB。这两种类型主要的区别在于数据存储格式&#xff0c;JSONB 使用二进制格式存储数据&#xff0c;更易于处理。 PostgreSQL 推荐优先选择 JSONB 数据类型。 两种数据类型之间的区别&#xff1a; 功能JSONJSONB存…

网络建设与运维23国赛网络运维正式赛题解析

竞赛环境请看主页&#xff01; 23国赛网络运维 任务描述&#xff1a;某集团公司在更新设备后&#xff0c;路由之间无法正常通信&#xff0c;请修 复网络达到正常通信。 &#xff08;1&#xff09; 请在server1“管理员”下拉菜单中选择“镜像”选项卡&#xff0c;点 击 “创…

超声波眼镜清洗机有用吗?四大主流超声波清洗机品牌整理测评

长期佩戴的眼镜&#xff0c;若不定期清洗&#xff0c;不仅镜片会逐渐积聚油脂、灰尘&#xff0c;影响透光率&#xff0c;使视物模糊&#xff0c;更严重的是&#xff0c;眼镜上日益增加的微小杂质和细菌可能会逐渐影响到眼睛健康&#xff0c;导致视力下降、眼部疾病等问题。 这…

Go 1.19.4 函数-Day 08

1. 函数概念和调用原理 1.1 基本介绍 函数是基本的代码块&#xff0c;用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称&#xff0c;返回类型&#xff0c;和参…

STM32 - PWR 笔记

PWR&#xff08;Power Control&#xff09;电源控制 PWR 负责管理 STM32 内部的电源供电部分&#xff0c;可以实现 可编程电压监测器 和 低功耗模式 的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到PVD…