sparkRDD教程之必会的题目
1.前期准备
(1)看看上一期的博客,最好跟着上一期的博客把sparkRDD的基本命令给熟练掌握后,再来做这篇文章的任务。
上一期的博客:sparkRDD教程之基本命令-CSDN博客
(2)新建文件task6.scala
package com.itheimaimport org.apache.spark.sql.SparkSessionobject task6 {def main(args: Array[String]): Unit = {val spark = SparkSession.builder.appName("task6").master("local").getOrCreate()val sc = spark.sparkContext//代码在这里写spark.stop()}}

(3)在开始写代码之前先熟悉一下这2个文件
result_bigdata.txt(学号,科目为大数据,成绩),注意了这里的分隔符为"\t"
1001 大数据基础 90
1002 大数据基础 94
1003 大数据基础 100
1004 大数据基础 99
1005 大数据基础 90
1006 大数据基础 94
1007 大数据基础 100
1008 大数据基础 93
1009 大数据基础 89
1010 大数据基础 78
1011 大数据基础 91
1012 大数据基础 84
result_math.txt(学号,科目为数学,成绩),注意了这里的分隔符为"\t"
1001 应用数学 96
1002 应用数学 94
1003 应用数学 100
1004 应用数学 100
1005 应用数学 94
1006 应用数学 80
1007 应用数学 90
1008 应用数学 94
1009 应用数学 84
1010 应用数学 86
1011 应用数学 79
1012 应用数学 91
2.任务1:(十分简单)
(1)取出大数据成绩排名前5的学生成绩信息并且在控制台打印出来,
代码1
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))println(math1.collect().mkString("\n"))
截图1

代码2(最终代码)
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))var rdd1 = math1.sortBy(x => x._3, false)println(rdd1.take(5).mkString("\n"))
截图2

(2)取出数学成绩排名前5的学生成绩信息并且在控制台打印出来
代码1
var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))println(bigdata1.collect().mkString("\n"))
截图1

代码2(最终代码)
var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))var rdd2=bigdata1.sortBy(x=>x._3,false)println(rdd2.take(5).mkString("\n"))
截图2

3.任务2:获取单科成绩为100的学生id
代码1
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd1 = math1.sortBy(x => x._3, false)
// println(rdd1.take(5).mkString("\n"))var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd2=bigdata1.sortBy(x=>x._3,false)
// println(rdd2.take(5).mkString("\n"))var total1 = math1.union(bigdata1)println(total1.collect().mkString("\n"))
截图1

代码2(最终代码)
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd1 = math1.sortBy(x => x._3, false)
// println(rdd1.take(5).mkString("\n"))var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd2=bigdata1.sortBy(x=>x._3,false)
// println(rdd2.take(5).mkString("\n"))var total1 = math1.union(bigdata1)val scoreIs100_id=total1.filter(x=>x._3==100).map(x=>x._1).distinct()
// println(total1.collect().mkString("\n"))println(scoreIs100_id.collect().mkString("\n"))
截图2

4.任务3:
(1)求每个学生的总成绩(即大数据成绩+数学成绩)
代码1
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd1 = math1.sortBy(x => x._3, false)
// println(rdd1.take(5).mkString("\n"))var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd2=bigdata1.sortBy(x=>x._3,false)
// println(rdd2.take(5).mkString("\n"))var math2=math1.map(x=>(x._1,x._3))var bigdata2=bigdata1.map(x=>(x._1,x._3))var total2=math2.union(bigdata2)println(total2.collect().mkString("\n"))
截图1

代码2
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd1 = math1.sortBy(x => x._3, false)
// println(rdd1.take(5).mkString("\n"))var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd2=bigdata1.sortBy(x=>x._3,false)
// println(rdd2.take(5).mkString("\n"))var math2 = math1.map(x => (x._1, x._3))var bigdata2 = bigdata1.map(x => (x._1, x._3))var total2=math2.union(bigdata2)var total_score=total2.reduceByKey((y1,y2)=>(y1+y2))println(total_score.collect().mkString("\n"))
截图2

代码3(最终代码)
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd1 = math1.sortBy(x => x._3, false)
// println(rdd1.take(5).mkString("\n"))var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd2=bigdata1.sortBy(x=>x._3,false)
// println(rdd2.take(5).mkString("\n"))var math2 = math1.map(x => (x._1, x._3))var bigdata2 = bigdata1.map(x => (x._1, x._3))var total2=math2.union(bigdata2)var total_score=total2.reduceByKey((y1,y2)=>(y1+y2)).map(x=>(x._1,"总成绩",x._2)).sortBy(x=>x._1)println(total_score.collect().mkString("\n"))
截图3

(2)求每个学生的平均成绩(即总成绩/科目总数)
代码1
var math_path = "src\\main\\resources\\result_math.txt"var math_data = sc.textFile(math_path)var math1 = math_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd1 = math1.sortBy(x => x._3, false)
// println(rdd1.take(5).mkString("\n"))var bigdata_path = "src\\main\\resources\\result_bigdata.txt"var bigdata_data = sc.textFile(bigdata_path)var bigdata1 = bigdata_data.map(x => x.split("\t")).map(x => (x(0), x(1), x(2).toInt))
// var rdd2=bigdata1.sortBy(x=>x._3,false)
// println(rdd2.take(5).mkString("\n"))var total0 = math1.union(bigdata1)//求科目总数var subjectNum=total0.map(x=>x._2).distinct().count().toIntvar aver1_score=total0.map(x=>(x._1,x._3)).reduceByKey((y1,y2)=>(y1+y2)).map(x=>(x._1,"平均成绩",x._2/subjectNum)).sortBy(x=>x._1)println(aver1_score.collect().mkString("\n"))
截图1

5.任务4:
(1)求全班大数据单科平均分
代码1
//求数学单科平均分var math_stuCount = math1.count().toIntvar math_oneSubjectAver = math1.map(x => (x._2, x._3)).reduceByKey((y1, y2) => (y1 + y2)).map(x => ("数学单科平均分", x._2 / math_stuCount))println(math_oneSubjectAver.collect().mkString(", "))
截图1

(2)求全班数学单科平均分
代码1
//求大数据单科平均分var bigdata_stuCount = bigdata1.count().toIntvar bigdata_oneSubjectAver = bigdata1.map(x => (x._2, x._3)).reduceByKey((y1, y2) => (y1 + y2)).map(x => ("大数据单科平均分", x._2 / bigdata_stuCount))println(bigdata_oneSubjectAver.collect().mkString(","))
截图1

6.其他
(1)sparkRDD是什么和sparkSQL是什么关系
在Apache Spark中,`RDD`(Resilient Distributed Dataset)和`SparkSQL`是两个不同的概念,它们分别代表了Spark中的核心数据结构和处理框架,但它们之间是有关系的。
### 1. **RDD(Resilient Distributed Dataset)**
- **定义**:RDD是Spark的核心抽象,是一个不可变的分布式数据集,支持并行处理。它是Spark计算模型的基础,所有的数据都可以通过RDD进行处理。
- **特性**:
- **弹性(Resilient)**:即使某些数据分区丢失,RDD也能够自动从其他地方恢复数据。
- **分布式(Distributed)**:RDD的元素存储在集群中的多个节点上,因此可以进行并行处理。
- **不可变(Immutable)**:RDD一旦创建,就无法更改。如果需要修改RDD的内容,必须创建一个新的RDD。
- **使用场景**:RDD通常用于处理低级的并行计算任务,它提供了丰富的操作,如`map`、`filter`、`reduce`等。
### 2. **SparkSQL**
- **定义**:SparkSQL是一个用于结构化数据查询的组件,它允许使用SQL查询、DataFrame和Dataset API对数据进行处理。SparkSQL支持从多种数据源加载数据,如Hive、Parquet、JSON等。
- **特性**:
- 支持通过SQL语法直接查询数据,使用SQL与RDD不同的高层次抽象(如DataFrame和Dataset)。
- 提供了对结构化数据的优化查询执行引擎,可以有效地优化查询计划。
- 可以通过SQL执行复杂的操作,如联接、分组、排序等。
- **使用场景**:SparkSQL适用于需要使用SQL查询的结构化数据处理场景,并且能比直接使用RDD更方便和高效地执行复杂查询。
### **RDD与SparkSQL的关系**
- **底层实现**:SparkSQL的核心实现是建立在RDD之上的。虽然用户可以使用SQL或者DataFrame API进行高层次操作,但底层的计算仍然通过RDD来实现。
- **转换关系**:
- `DataFrame`和`Dataset`(SparkSQL的两种高层次API)都是基于RDD构建的。你可以通过将RDD转换为DataFrame或Dataset来利用SparkSQL提供的优化和功能。
- 例如,`DataFrame`是一个分布式的数据集,类似于数据库中的表格,它是在RDD的基础上进一步封装的,提供了更高效的查询和处理功能。
- **性能优化**:SparkSQL通过Catalyst查询优化器对SQL查询进行优化,生成更高效的执行计划。这个优化过程是通过RDD操作的进一步封装和调整来实现的,确保SparkSQL在处理数据时尽可能高效。
### 总结
- **RDD** 是Spark的基础抽象,代表分布式、不可变的数据集。
- **SparkSQL** 是一个高层次的接口,用于进行结构化数据的查询和分析,支持SQL语法和更高级的DataFrame、Dataset API。它建立在RDD的基础上,但提供了更优化和简便的查询方式。
(2)spark-shell是什么
`spark-shell` 是 Apache Spark 提供的一个交互式命令行工具,用于与 Spark 集群进行交互并执行 Spark 作业。它提供了一个基于 Scala 的 REPL(Read-Eval-Print Loop)环境,允许用户以编程方式直接在 Spark 集群上运行代码、执行数据分析操作和调试任务。
具体来说,`spark-shell` 的功能包括:
1. **交互式编程**:通过 Scala 命令行,用户可以直接在 Spark 集群上运行代码,而无需编写完整的 Spark 应用程序。
2. **集群管理**:它自动设置 Spark 集群的连接和资源管理,帮助用户方便地运行分布式计算任务。
3. **调试和测试**:适用于开发和调试阶段,可以快速验证代码段或算法的执行结果。
4. **支持 RDD 和 DataFrame 操作**:用户可以利用 `spark-shell` 进行 Spark 核心功能的操作,如 RDD 和 DataFrame 的创建与转换。
### 使用方式
在安装了 Spark 的机器上,可以通过命令行启动 `spark-shell`:
```bash
./bin/spark-shell
```
这将启动一个 Scala REPL 环境,允许用户通过 Scala 编写并执行 Spark 代码。
### 示例
启动 `spark-shell` 后,可以执行如下操作:
```scala
val data = sc.parallelize(1 to 100)
val result = data.filter(_ % 2 == 0).collect()
println(result.mkString(", "))
```
以上代码会在 Spark 集群上并行地处理数据,筛选出偶数并返回结果。
总的来说,`spark-shell` 是一个非常有用的工具,适合用于快速原型开发、调试以及测试 Spark 程序。
相关文章:
sparkRDD教程之必会的题目
1.前期准备 (1)看看上一期的博客,最好跟着上一期的博客把sparkRDD的基本命令给熟练掌握后,再来做这篇文章的任务。 上一期的博客:sparkRDD教程之基本命令-CSDN博客 (2)新建文件task6.scala …...
Unity 2d描边基于SpriteRender,高性能的描边解决方案
目标 以Unity默认渲染管线为例,打造不需要图片内边距,描边平滑,高性能的描边解决方案 前言 在2d游戏中经常需要给2d对象添加描边,来突出强调2d对象 当你去网上查找2d描边shader,移植到项目里面,大概率会…...
信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高
《港湾商业观察》施子夫 1月8日,深交所官网显示,浙江信凯科技集团股份有限公司(以下简称“信凯科技”)主板IPO提交注册。 自2022年递交上市申请,信凯科技的IPO之路已走过两年光景,尽管提交注册࿰…...
js基础---var与let的区别以及const的使用
js基础—var与let的区别以及const的使用 var与let的区别 在较旧的JavaScript,使用关键字var来声明变量,而不是let。var现在开发中一般不再使用它,只是我们可能再老版程序中看到它。let的出现为了解决var的一些问题。 var 声明存在以下三种问…...
用css和html制作太极图
目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …...
OJ12:160. 相交链表
目录 题目思路分析代码展示 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 示例 1: 输入:intersectVal 8, listA [4,1,8,4,5], listB [5,…...
软件工程和项目管理领域 - CMMI 极简理解
CMMI 概述 CMMI 全称为 Capability Maturity Model Integration,即能力成熟度模型集成 CMMI 是由美国卡内基梅隆大学软件工程研究所(SEI)开发的一套综合性管理模型 CMMI 是一种用于评估和改进组织在软件开发和维护方面过程能力的国际标准 …...
C# 线程基础之 线程同步
线程同步的手段很多 lock 是通过内存索引块 0 1 切换 进行互斥的实现 互斥量 信号量 事件消息 其实意思就是 一个 标记量 通过这个标记 来进行类似的互斥手段 具体方式的分析 代码在后 1.互斥量 Mutex 作用 非常类似lock 一个Mutex 名称来代替 lock的引用对象 2.信号量 Semaph…...
[c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
大家好啊,在今天的快乐刷题中,我们遇到了这样一道题目: 题目 写出 三种不同方式的 交换两个整数变量的 函数 交换变量的三种解法 常规方式 想要交换两个变量很简单,第一种方式就是新建一个临时变量,具体流程如下&…...
RocketMQ 知识速览
文章目录 一、消息队列对比二、RocketMQ 基础1. 消息模型2. 技术架构3. 消息类型4. 消费者类型5. 消费者分组和生产者分组 三、RocketMQ 高级1. 如何解决顺序消费和重复消费2. 如何实现分布式事务3. 如何解决消息堆积问题4. 如何保证高性能读写5. 刷盘机制 (topic 模…...
优化 Azure Synapse Dedicated SQL Pool中的 SQL 执行性能的经验方法
在 Azure Synapse Dedicated SQL Pool中优化 SQL 执行涉及了解底层体系结构(例如分布和分区)、查询优化(例如避免不必要的子查询和联接),以及利用具体化视图和 PolyBase 等工具进行高效数据加载。 1.有效使用分布和分…...
详解英语单词“pro bono”:公益服务的表达(中英双语)
中文版 详解英语单词“pro bono”:公益服务的表达 一、词义解释 “Pro bono” 是一个源自拉丁语的短语,完整表达为 “pro bono publico”,意思是“为了公众利益”(for the public good)。在现代英语中,它…...
16. C语言 字符串详解
本章目录: 前言C 字符串的基础概念字符串的定义字符串的内存表示 常见的字符串操作函数示例代码 深入探讨字符串长度计算strlen 与 sizeof 的区别 字符串操作的注意事项**1. 字符数组的大小**2. 字符数组和字符指针的区别3. 使用安全函数 字符串的遍历与格式化输出**遍历字符串…...
使用Buildroot开始嵌入式Linux系统之旅-3
文章目录 at91bootstrap操作教程修改at91bootstrap具体配置重新编译at91bootstrap U-Boot操作教程修改U-Boot具体配置重新编译U-Boot Linux Kernel操作教程修改Linux Kernel具体配置重新编译Linux Kernel buildroot操作进阶生成图形化软件模块依赖关系查看具体软件模块依赖关系…...
[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue新能源汽车充电桩管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来࿰…...
【已解决】【记录】2AI大模型web UI使用tips 本地
docker desktop使用 互动 如果需要发送网页链接,就在链接上加上【#】号 如果要上传文件就点击这个➕号 中文回复 命令它只用中文回复,在右上角打开【对话高级设置】 输入提示词(提示词使用英文会更好) Must reply to the us…...
44.ComboBox的数据绑定 C#例子 WPF例子
固定最简步骤,包括 XAML: 题头里引入命名空间 标题下面引入类 combobox绑定资源属性和选择属性,block则绑定和combobox一样的选择属性 C#: 通知的类,及对应固定的任务 引入字段 引入属性 其中资源是只读的 选…...
物联网之传感器技术
引言 在数字化浪潮席卷全球的今天,物联网(IoT)已成为推动各行各业变革的重要力量。而物联网传感器,作为物联网感知层的核心技术,更是扮演着不可或缺的角色。它们如同人类的五官,能够感知物理世界中的各种信…...
QTreeWidget QTreeWidgetItem
QTreeWidgetItem 是 Qt 框架中用于在 QTreeWidget 中表示树形结构中每个节点的类。它是 QTreeWidget 的一部分,允许您创建和管理层次结构的数据展示。 QTreeWidgetItem 用于表示树形结构中的单个节点。 添加子节点: 可以通过 addChild() 方法向节点添加…...
torch.einsum计算张量的外积
torch.einsum 是一种强大的张量操作工具,可以通过爱因斯坦求和约定(Einstein summation convention)来简洁地表示复杂的张量运算。通过它,我们可以高效地计算矩阵乘法、转置、点积、外积等操作。 以下是关于如何使用 torch.einsum 计算两个四维张量在第三维度上的外积的解…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
