sparkSQL练习

1.前期准备

(1)建议先把这两篇文章都看一下吧,然后把这个项目也搞下来

(2)看看这个任务

(3)score.txt

student_id,course_code,score
108,3-105,99
105,3-105,88
107,3-105,77
105,3-245,87
108,3-245,89
107,3-245,82
106,3-245,74
107,6-101,75
108,6-101,82
106,6-101,65
109,6-102,99
101,6-102,79
105,9-106,81
106,9-106,97
107,9-106,65
108,9-106,100
109,9-106,82
105,6-102,85

(4)student.txt

student_id,student_name,gender,birthday,class_id
108,ZhangSan,male,1995/9/1,95033
105,KangWeiWei,female,1996/6/1,95031
107,GuiGui,male,1992/5/5,95033
101,WangFeng,male,1993/8/8,95031
106,LiuBing,female,1996/5/20,95033
109,DuBingYan,male,1995/5/21,95031

(5)teacher.txt

teacher_id,teacher_name,gender,birthday,title,department
825,LinYu,male,1958/1/1,Associate professor,department of computer
804,DuMei,female,1962/1/1,Assistant professor,computer science department
888,RenLi,male,1972/5/1,Lecturer,department of electronic engneering
852,GongMOMO,female,1986/1/5,Associate professor,computer science department
864,DuanMu,male,1985/6/1,Assistant professor,department of computer

(6)course.txt

course_code,course_name,teacher_id
3-105,Introduction to computer,825
3-245,The operating system,804
6-101,Spark SQL,888
6-102,Spark,852
9-106,Scala,864

(7)代码准备

创建文件名为task7.scala

代码为

package com.itheimaimport org.apache.spark.sql.SparkSession//spark-sql
object task7 {def main(args: Array[String]): Unit = {// 创建SparkSessionval spark = SparkSession.builder.appName("task7").master("local").getOrCreate()var teacher_path="src\\main\\resources\\teacher.txt"var teacher_df=spark.read.options(Map("sep"->",", "header"->"true")).csv(teacher_path)var student_path = "src\\main\\resources\\student.txt"var student_df = spark.read.options(Map("sep" -> ",", "header" -> "true")).csv(student_path)var score_path = "src\\main\\resources\\score.txt"var score_df = spark.read.options(Map("sep" -> ",", "header" -> "true")).csv(score_path)var course_path = "src\\main\\resources\\course.txt"var course_df = spark.read.options(Map("sep" -> ",", "header" -> "true")).csv(course_path)spark.stop()}}

2.任务实现

(1)按照班级降序排序显示所有学生信息

代码1

    student_df.sort(student_df("class_id").desc).show()

截图1

(2)查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof

代码1

    var tdepartment=teacher_df("department")teacher_df.filter(tdepartment.contains("electronic")||tdepartment.contains("computer")).select("teacher_name","title").show()

截图1

(3)显示student表中记录数

代码1

    println(student_df.count())

截图1

(4)显示性别为男的教师信息

代码1

    var tsex=teacher_df("gender")teacher_df.filter(tsex==="male").show()

截图1

(5)显示不重复的教师部门信息

代码1

    teacher_df.select("department").distinct().show()

截图1

(6)显示学号为101的学生信息

代码1

    var stu_id=student_df("student_id")student_df.filter(stu_id===101).show()

截图1

(7)将教师信息以List的形式显示

代码1

    teacher_df.collect().toList.foreach(println)

截图1

(8)查询所有“女”教师和“女”同学的name、sex和birthday

代码1

    //lit 函数用于创建一个字面量(常量)列//col 函数用于引用 DataFrame 中的列var t_res=teacher_df.filter(col("gender")==="female").select(col("teacher_name").as("name"),col("gender"),col("birthday"),lit("teacher").as("type"))var stu_res = student_df.filter(col("gender") === "female").select(col("student_name").as("name"),col("gender"), col("birthday"),lit("student").as("type"))t_res.union(stu_res).show()

截图1

3.补充笔记

(1)这两个上课时老师没有讲到,但是有用

导入这些库,才能使用这些函数

import org.apache.spark.sql.functions.col
import org.apache.spark.sql.functions.lit
//lit 函数用于创建一个字面量(常量)列
//col 函数用于引用 DataFrame 中的列

(2)导入函数库要注意

在 Scala 语言中,_(下划线)是一个特殊的符号,具有多种用途。在 import 语句中,_ 用来表示“所有”,是一种通配符。

当你看到这样的导入语句:

scala复制

import org.apache.spark.sql.functions._

这里的 _ 表示导入 org.apache.spark.sql.functions 包中的所有公共成员(包括类、对象、函数等)。这样做的好处是可以让你在后续的代码中直接使用该包中的所有函数和类,而无需再次指定完整的包名。例如,你可以直接使用 collit 等函数,而不需要写成 org.apache.spark.sql.functions.colorg.apache.spark.sql.functions.lit

不过,这种导入方式也有缺点,可能会导致命名冲突,特别是当你从多个包中导入所有成员时,如果有两个包中存在同名的成员,就会出现冲突。因此,在一些情况下,更推荐使用具体的导入方式,明确指定需要导入的成员,以避免潜在的冲突。

(3)有关这四个txt文件的注释如下

这4份数据分别代表了课程信息、学生成绩、学生信息和教师信息,下面分别进行解析:

课程信息

  • 字段说明

    • course_code:课程代码,如“3-105”“3-245”等,是课程的唯一标识。

    • course_name:课程名称,如“Introduction to computer”“The operating system”等,表明课程的具体内容。

    • teacher_id:教师编号,如“825”“804”等,表示教授该课程的教师。

  • 数据内容

    • 共有5门课程,涵盖了计算机基础、操作系统、Spark相关知识以及Scala语言等领域,课程代码、名称和对应的教师编号一一对应。

学生成绩

  • 字段说明

    • student_id:学生编号,如“108”“105”等,是学生的唯一标识。

    • course_code:课程代码,与课程信息表中的课程代码相对应,表示学生所选修的课程。

    • score:分数,如“99”“88”等,表示学生在该课程中的成绩。

  • 数据内容

    • 每位学生选修了不同数量的课程,如学生105选修了3门课程,学生107选修了3门课程等。不同学生在相同课程中的成绩有高有低,例如在“3-105”这门课中,学生108得了99分,学生105得了88分,学生107得了77分。

学生信息

  • 字段说明

    • student_id:学生编号,与学生成绩表中的学生编号相对应。

    • student_name:学生姓名,如“ZhangSan”“KangWeiWei”等,表明学生的具体身份。

    • gender:性别,如“male”“female”,表示学生的性别。

    • birthday:生日,如“1995/9/1”“1996/6/1”等,记录学生的出生日期。

    • class_id:班级编号,如“95033”“95031”,表示学生所在的班级。

  • 数据内容

    • 共有6名学生,姓名、性别、生日和班级编号等信息齐全。从生日来看,学生年龄有大有小,如GuiGui生于1992年,而KangWeiWei生于1996年。从班级编号来看,学生分布在95031班和95033班两个班级。

教师信息

  • 字段说明

    • teacher_id:教师编号,与课程信息表中的教师编号相对应。

    • teacher_name:教师姓名,如“LinYu”“DuMei”等,表明教师的具体身份。

    • gender:性别,如“male”“female”,表示教师的性别。

    • birthday:生日,如“1958/1/1”“1962/1/1”等,记录教师的出生日期。

    • title:职称,如“Associate professor”“Assistant professor”“Lecturer”,表示教师的专业技术职称。

    • department:系别,如“department of computer”“computer science department”“department of electronic engneering”,表示教师所在的系别。

  • 数据内容

    • 共有5名教师,姓名、性别、生日、职称和系别等信息完整。从职称来看,有副教授、助理教授和讲师等不同职称。从系别来看,教师分布在计算机系、计算机科学系和电子工程系等不同系别。

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

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

相关文章

使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用

首先服务器上需要安装docker已经docker-compose,如果没有,可以参考我之前写的文章进行安装。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下载并启动elk容器 先创建一个网关,让所有的容器共用此网…

vue3+elementPlus之后台管理系统(从0到1)(day1)

vue3官方文档:https://cn.vuejs.org/guide/introduction.html 1、项目创建 确保电脑已安装node 查看命令: node -v进入项目目录,创建项目 npm init vuelatest Need to install the following packages: create-vue3.13.0 Ok to procee…

SparkSQL数据模型综合实践

文章目录 1. 实战概述2. 实战步骤2.1 创建数据集2.2 创建数据模型对象2.2.1 创建常量2.2.2 创建加载数据方法2.2.3 创建过滤年龄方法2.2.4 创建平均薪水方法2.2.5 创建主方法2.2.6 查看完整代码 2.3 运行程序,查看结果 3. 实战小结 1. 实战概述 在本次实战中&#…

软件设计大致步骤

由于近期在做软件架构设计,这里总结下大致的设计流程 软件设计流程 1 首先要先写系统架构图,将该功能在整个系统的位置以及和大致的内部模块划分 2 然后写内部的结构图,讲内部的各个子系统,模块,组件之间的关系和调用…

读取长文本,使用读取底表

文章目录 代码有原始数据内表作为主表连接STXL的示例获取物料分类获取物料分类的文本的宏读取分类 https://blog.csdn.net/DeveloperMrMeng/article/details/118354649 代码 "第三种:读取底表获取文本 DATA: LT_TLINE TYPE STANDARD TABLE OF TLINE. DATA: LS…

阀井可燃气体监测仪,开启地下管网安全新篇章-旭华智能

在城市的脉络中,地下管网犹如隐秘的动脉,支撑着现代生活的运转。而在这庞大网络的关键节点上,阀井扮演着不可或缺的角色。然而,由于其密闭性和复杂性,阀井内部一旦发生可燃气体泄漏,将对公共安全构成严重威…

Golang结合MySQL和DuckDB提高查询性能

要在Golang中组合MySQL和DuckDB以提高查询性能,请考虑使用混合查询执行方法。这种方法利用了MySQL强大的事务管理和DuckDB闪电般的分析处理能力。本文介绍如何充分利用两者的方法。 各取所长 用MySQL处理事务,用DuckDB处理分析 MySQL应该处理常规的INS…

Docker PG流复制搭建实操

目录标题 制作镜像1. 删除旧的容器2. 创建并配置容器3. 初始化数据库并启动 主库配置参数4. 配置主库5. 修改 postgresql.conf 配置 备库配置参数6. 创建并配置备库容器7. 初始化备库 流复制8. 配置&检查主库复制状态9. 检查备库配置 优化建议问题1:FATAL: usin…

增广卡尔曼滤波AKF的要点分析

增广卡尔曼滤波(Augmented Kalman Filter, AKF)是相对特定的卡尔曼滤波模型来说的,在状态量和/或观测量上进行增广,以满足特定的要求。 通常用于:专门用于处理具有状态噪声和观测噪声的不确定性,尤其是在需要同时估计系统状态和额外参数时。它通过将额外的参数或状态变量…

三只松鼠携手爱零食,社区零售新高峰拔地而起

合纵连横,这是当前零售行业发展的一个主旋律。从商超之王胖东来的全国调改,到社区零售正在进行的渠道变革,竞争的激烈和商业模式的升级令人目不暇接。 量贩零食赛道在过去一年就是如此,有杀伐,有并购,刀光…

Java并发编程——线程池(基础,使用,拒绝策略,命名,提交方式,状态)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1)基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2)分层结构 if 表达式 then 命令表1 else 命令表2 fi 3)嵌套结构 if …

tomcat文件目录讲解

目录的用处 bin:tomcat的可执行命令,比如:tomcat的启动停止命令,也包含其他命令以及.bat(Windows执行的命令)和.sh(Linux操作系统执行的命令)文件config:关于tomcat的配置&#xff0…

【Rust自学】12.4. 重构 Pt.2:错误处理

12.4.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读取…

梁山派入门指南4——定时器使用详解,包括定时器中断、PWM产生、输入捕获测量频率

梁山派入门指南4——定时器使用详解,包括定时器中断、PWM产生、输入捕获测量频率 1. 定时器概览2.基本定时器2.1 基本定时器介绍2.2 梁山派上的基本定时器开发2.2.1. 了解梁山派上的基本定时器资源(实际上我们以及在上面了解过了)2.2.2. 配置…

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人,做完后需要合并 遇到情况如下 那是因为直接选择了整列,当然不可以了。 下面提供几种方法,应该都可以 直接选中要复制区域然后复制,不要选中最上面的列alt;选中可见单元格正常复制&#xff…

JVM类加载器(附面试题)

什么是类加载器 类加载器(ClassLoader) 是 Java 虚拟机(JVM)中的一个组件,用于在运行时将字节码文件加载到内存中,并将其转换为 JVM 可以执行的二进制数据结构。 字节码文件通常是以.class为扩展名的文件…

FFmpeg硬件解码

使用FFmpeg进行硬件解码时,通常需要结合FFmpeg的API和硬件加速API(如CUDA、VAAPI、DXVA2等)。以下是一个简单的C代码示例,展示如何使用FFmpeg进行硬件解码。这个示例使用了CUDA作为硬件加速的后端。 1. 安装FFmpeg和CUDA 确保你…

Linux 进程前篇(冯诺依曼体系结构和操作系统)

目录 一.冯诺依曼体系结构 1.概念 2.硬件层面的数据流 3.总结加补充 二.操作系统 (Operating System) 1.概念 2.设计OS的目的 3.定位 4.操作系统的管理 5.计算机体系的层状结构 在我们认识进程之前,我们先了解什么是冯诺依曼体系结构 一.冯诺依曼体系结构…

Redis 3.2.1在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个文件可以跟我要,也可以从官网下载:https://github.com/MicrosoftArchive/redis/releases 这个是微软以前维护的Windows版Redis安装包,如果想要比较新的版本可以从别人维护的项目里下(https://…