sparkSQL练习

news2025/1/15 23:06:00

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.itheima

import org.apache.spark.sql.SparkSession

//spark-sql
object task7 {
  def main(args: Array[String]): Unit = {
    // 创建SparkSession
    val 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.coloradmin.cn/o/2277224.html

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

相关文章

CSS | 实现三列布局(两边边定宽 中间自适应,自适应成比)

目录 示例1 (中间自适应 示例2(中间自适应 示例3(中间自适应 示例4 (自适应成比 示例5(左中定宽,右边自适应 示例6(中间自适应 示例7(中间自适应 示例8(中间定宽…

力扣 子集

回溯基础,一题多解,不同的回朔过程。 题目 求子集中,数组的每种元素有选与不选两种状态。因此在使用dfs与回溯时把每一个元素分别进行选与不选的情况考虑即可。可以先用dfs跳过当前元素即不选然后一直深层挖下去,直到挖到最深了即…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址(Internet Protocol Address)是指互联网协议地址。 它是分配给连接到互联网的设备(如计算机、服务器、智能手机…

RocketMQ 知识速览

文章目录 一、消息队列对比二、RocketMQ 基础1. 消息模型2. 技术架构3. 消息类型4. 消费者类型5. 消费者分组和生产者分组 三、RocketMQ 高级1. 如何解决顺序消费和重复消费2. 如何实现分布式事务3. 如何解决消息堆积问题4. 如何保证高性能读写5. 刷盘机制 (topic 模…

C++(类和对象)

C中的类 C中兼容对C语言中struct的所有用法.同时C对struct进行了语法的升级.将struct升级成了类. // c中对于struct的改进: struct Stack {int* a;int top;int capacity; } int main() { Stack s;// 这里可以直接使用Stack进行使用,而不再需要struct关键字了return 0; }注意:…

centos 8 中安装Docker

注:本次样式安装使用的是centos8 操作系统。 1、镜像下载 具体的镜像下载地址各位可以去官网下载,选择适合你们的下载即可! 1、CentOS官方下载地址:https://vault.centos.org/ 2、阿里云开源镜像站下载:centos安装包…

Sui Move:基本概览一

Module (模块) Move 代码被组织成模块, 可以把一个模块看成是区块链上的一个智能合约 可以通过调用这些模块中的函数来与模块进行交互,可以通过事务或其他 Move 代码来实现, 事务将被发送到并由Sui区块链进行处理,一旦执行完成,结果的更改将…

1/13+2

运算符重载 myString.h #ifndef MYSTRING_H #define MYSTRING_H #include <cstring> #include <iostream> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度int capacity; …

GD32F470Z外部晶振不起振

亲测&#xff0c;主要的原因是因为系统配置里面选择的晶振&#xff0c;选择内部还是外部的无源晶振。 1.无源晶振 打开startup_gd32f450_470.s这个起始文件。 ​​​​​​​ ​​​​​​​ 找到SystemInit。 跳进去这个函数。 在这个函数里面最底下找到sys…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【2025 Rust学习 --- 17 文本和格式化 】

字符串与文本 Rust 的主要文本类型 String、str 和 char 内容概括&#xff1a; Unicode 背景知识&#xff1f;单个 Unicode 码点的 char&#xff1f;String 类型和 str 类型都是表示拥有和借用的 Unicode 字符序列。Rust 的字符串格式化工具&#xff0c;比如 println! 宏和 …

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的&#xff1a;创建适用于该项目的环境&#xff0c;与系统环境隔离&#xff0c;防止污染系统环境&#xff08;包括需要的库&#xff09;虚拟环境配置存放在项目根目录下的 ven…

phpenc加密程序源码

免费扩展加密程序&#xff0c;类似于sg11加密&#xff0c;支持单个PHP&#xff08;免费&#xff09;文件以及批量PHP文件&#xff08;ZIP压缩包格式&#xff09;源码加密的保护平台&#xff0c;加密后的源码文件保持原有代码结构&#xff0c;可以跨平台运行&#xff0c;可以运行…

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…

LeetCode热题100(哈希篇)

题目出自Leetcode热题100&#xff1a;Leetcode热题100 文章目录 1. 两数之和思路代码CJavaPython 49. 字母异位词分组思路代码CJavaPython 128. 最长连续序列思路代码CJavaPython 总结 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找…

python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言 前序学习进程中&#xff0c;我们至少掌握了两种方法&#xff0c;可以实现对图像实现缩放。 第一种方法是调用cv2.resize()函数实现&#xff0c;相关学习链接为&#xff1a; python学opencv|读取图像&#xff08;三&#xff09;放大和缩小图像_python opencv 读取图…

rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库

问题说明&#xff1a; 客户反馈 &#xff0c;buildroot 系统 &#xff0c;使用qt 使用sqlite &#xff0c;有报错&#xff0c;无法使用sqlite. 测试情况说明&#xff1a; 我自己测试&#xff0c;发现&#xff0c; buildroot 自己默认就是 使能了 sqlite 的。 是否解决说明&…

Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt绘图基础 QPainter概述 基本工作流程 绘图事件系统 paintEvent事件 重绘机制 文字绘制技术 基本文字绘制 ​编辑 高级文字效果 基本图形绘制 线条绘制 ​编辑 形状绘制 …

OpenArk64:Windows 系统分析与逆向工程工具详解

引言 在 Windows 系统的底层操作和逆向工程领域&#xff0c;OpenArk 是一款备受推崇的开源工具集。而 OpenArk64.exe 是 OpenArk 工具的 64 位版本&#xff0c;专门用于 64 位 Windows 系统。它提供了强大的功能&#xff0c;帮助用户深入分析系统内核、进程、文件、注册表等&a…