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
包中的所有公共成员(包括类、对象、函数等)。这样做的好处是可以让你在后续的代码中直接使用该包中的所有函数和类,而无需再次指定完整的包名。例如,你可以直接使用 col
、lit
等函数,而不需要写成 org.apache.spark.sql.functions.col
、org.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名教师,姓名、性别、生日、职称和系别等信息完整。从职称来看,有副教授、助理教授和讲师等不同职称。从系别来看,教师分布在计算机系、计算机科学系和电子工程系等不同系别。
-