spark sql的练习题

1、使用Structured Streaming读取Socket数据,把单词和单词的反转组成 json 格式写入到当前目录中的file文件夹中
2、请使用Structured Streaming读取student_info文件夹写的csv文件,
2.1、统计出文件中的男女生各有多少人
2.2、统计出姓“王”男生和女生的各有多少人
3、请使用Structured Streaming读取department_info文件夹写的csv文件
3.1统计出各个院系的分别多少条信息
4、请使用spark sql读取student_score文件夹写的csv文件
4.1、统计出每个班级的最高分数
4.2、统计出男生最高分
4.3、统计出女生最高分
4.4、分别统计出男生和女生的分数前三名
4.5、统计出分数在500分以上的人数
4.7、统计出分数在300分以下的人中男女各占多少
5.请使用Spark sql读取class_info文件夹写的csv文件
5.1、统计出哪个院系的专业最多
5.2、统计出计算机学院中有多少专业
5.3、统计出经济管理学院的会计和工商管理的班级数
5.4、分别统计出每个学院的班级最多的专业
5.5、统计出班级编号以2开头的所有的专业名称
以下是sparksql的练习题
表(一)Student (学生表)
属性名 数据类型 可否为空 含 义
Sno varchar (20) 否 学号
Sname varchar (20) 否 学生姓名
Ssex varchar (20) 否 学生性别
Sbirthday datetime 可 学生出生年月
Class varchar (20) 可 学生所在班级
表(二)Course(课程表)
属性名 数据类型 可否为空 含 义
Cno varchar (20) 否 课程号
Cname varchar (20) 否 课程名称
Tno varchar (20) 否 教工编号
表(三)Score(成绩表)
属性名 数据类型 可否为空 含 义
Sno varchar (20) 否 学号
Cno varchar (20) 否 课程号
Degree Decimal(4,1) 可 成绩
表(四)Teacher(教师表)
属性名 数据类型 可否为空 含 义
Tno varchar (20) 否 教工编号
Tname varchar (20) 否 教工姓名
Tsex varchar (20) 否 教工性别
Tbirthday datetime 可 教工出生年月
Prof varchar (20) 可 职称
Depart varchar (20) 否 教工所在部门
表1-2数据库中的数据
表(一)Student
Sno Sname Ssex Sbirthday class
108 丘东 男 1977-09-01 95033
105 匡明 男 1975-10-02 95031
107 王丽 女 1976-01-23 95033
101 李军 男 1976-02-20 95033
109 王芳 女 1975-02-10 95031
103 陆君 男 1974-06-03 95031
表(二)Course
Cno Cname Tno
3-105 计算机导论 825
3-245 操作系统 804
6-166 数字电路 856
9-888 高等数学 831
表(三)Score
Sno Cno Degree
103 3-245 86
105 3-245 75
109 3-245 68
103 3-105 92
105 3-105 88
109 3-105 76
101 3-105 64
107 3-105 91
108 3-105 78
101 6-166 85
107 6-166 79
108 6-166 81
表(四)Teacher
Tno Tname Tsex Tbirthday Prof Depart
804 李诚 男 1958-12-02 副教授 计算机系
856 张旭 男 1969-03-12 讲师 电子工程系
825 王萍 女 1972-05-05 助教 计算机系
831 刘冰 女 1977-08-14 助教 电子工程系
6、查询Student表中“95031”班或性别为“女”的同学记录。
7、以Class降序,升序查询Student表的所有记录。
8、以Cno升序、Degree降序查询Score表的所有记录。
9、查询“95031”班的学生。
10、查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
11、查询每门课的平均成绩。
12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
13、查询分数大于70,小于90的Sno列。
14、查询所有学生的Sname、Cno和Degree列。
15、查询所有学生的Sno、Cname和Degree列。
16、查询所有学生的Sname、Cname和Degree列。
17、查询“95033”班学生的平均分。
18、查询所有选修“计算机导论”课程的“女”同学的成绩表。
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。
21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
22、查询和学号为105的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
23、查询“张旭“教师任课的学生成绩
24、查询选修某课程的同学人数多于4人的教师姓名。
25、查询95033班和95031班全体学生的记录。
26、查询存在有85分以上成绩的课程Cno.
27、查询出“计算机系“教师所教课程的成绩表。
28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
31、查询所有教师和同学的name、sex和birthday.
32、查询所有“女”教师和“女”同学的name、sex和birthday.
33、查询成绩比该课程平均成绩低的同学的成绩表。
34、查询所有任课教师的Tname和Depart.
35、查询所有未讲课的教师的Tname和Depart.
36、查询至少有2名男生的班号。
37、查询Student表中不姓“王”的同学记录。
38、查询Student表中每个学生的姓名和年龄。将函数运用到spark sql中去计算,可以直接拿String的类型计算不需要再转换成数值型 默认是会转换成Double类型计算浮点型转整型
39、查询Student表中最大和最小的Sbirthday日期值。 时间格式最大值,最小值
40、以班号和年龄从大到小的顺序查询Student表中的全部记录。 查询结果排序
41、查询“男”教师及其所上的课程。
42、查询最高分同学的Sno、Cno和Degree列。
43、查询和“李军”同性别的所有同学的Sname.
44、查询和“李军”同性别并同班的同学Sname.
45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
46、查询Student表中的所有记录的Sname、Ssex和Class列。
47、查询教师所有的单位即不重复的Depart列。
48、查询Student表的所有记录
49、查询Score表中成绩在60到80之间的所有记录。
50、查询Score表中成绩为85,86或88的记录。
代码:

1、1、使用Structured Streaming读取Socket数据,把单词和单词的反转组成 json 格式写入到当前目录中的file文件夹中
object day {
  //1、请使用Structured Streaming读取Socket数据,统计出每个单词的个数
  def main(args: Array[String]): Unit = {
    //1.创建SparkSession
    val spark: SparkSession = SparkSession.builder().master("local[*]").appName("day1").getOrCreate()
    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")
    val frame: DataFrame = spark.readStream
      .option("host", "hadoop01")
      .option("port", 9999)
      .format("socket")
      .load()
    import  spark.implicits._
    val dataDS: Dataset[String] = frame.as[String]
    val wordDF = dataDS.flatMap(_.split(" "))
      .map({ x => (x, x.reverse) }).toDF("before", "reverse")
    //wordDF.show()
    //输出数据
    wordDF.writeStream
      .format("json")
      .option("path","F:\\第四学期的大数据资料\\day02四月份资料\\第二周\\day05\\4.16号练习题50道2.0\\file")
      .option("checkpointLocation","json")//必须指定 checkpoint 目录,否则报错
      .trigger(Trigger.ProcessingTime(0))
      .start()
      .awaitTermination()
  }
}
2、请使用Structured Streaming读取student_info文件夹写的csv文件,
2.1、统计出文件中的男女生各有多少人
2.2、统计出姓“王”男生和女生的各有多少人
object day2 {
  def main(args: Array[String]): Unit = {
    //创建SparkSession
    val spark: SparkSession =
    SparkSession.builder().master("local[*]").appName("day2").getOrCreate()
    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")
    //准备数据结构
    val Schema: StructType = new StructType()
      .add("id", "integer")
      .add("name", "string")
      .add("sex", "string")
      .add("classs", "string")
      .add("date", "string")
    //接受数据
    import spark.implicits._
    val dataDF: DataFrame =
      spark.readStream.schema(Schema).csv("F:\\第四学期的大数据资料\\day02四月份资料\\第二周\\day05\\4.16号练习题50道2.0\\student_info")
    // 根据业务处理和计算数据
    val result: Dataset[Row] =
    //2.1、统计出文件中的男女生各有多少人
      dataDF.selectExpr("sex").groupBy("sex").count().sort($"count".desc)
    //2.2、统计出姓“王”男生和女生的各有多少人
    dataDF.select("name", "sex").where("name like '%王%'")
      .groupBy("sex").count().sort($"count".desc)
    //输出数据
    result.writeStream
      .format("console")
      .outputMode("complete")
      .trigger(Trigger.ProcessingTime(0))
      .start()
      .awaitTermination()
  }
}
3、请使用Structured Streaming读取department_info文件夹写的csv文件
3.1统计出各个院系的分别多少条信息
def main(args: Array[String]): Unit = {
    //创建SparkSession
    val spark: SparkSession =
      SparkSession.builder().master("local[*]").appName("day2").getOrCreate()
    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")
    //准备数据结构
    val Schema: StructType = new StructType()
      .add("id", "integer")
      .add("name", "string")
    //接受数据
    import spark.implicits._
    val dataDF: DataFrame =
      spark.readStream.schema(Schema).csv("F:\\第四学期的大数据资料\\day02四月份资料\\第二周\\day05\\4.16号练习题50道2.0\\department_info")
    // 根据业务处理和计算数据
    val result: Dataset[Row] =
    //3.1统计出各个院系的分别多少条信息
      dataDF.select("name")
        .groupBy("name").count().sort($"count".desc)
    //输出数据
    result.writeStream
      .format("console")
      .outputMode("complete")
      .trigger(Trigger.ProcessingTime(0))
      .start()
      .awaitTermination()
  }
4、请使用spark sql读取student_score文件夹写的csv文件
4.1、统计出每个班级的最高分数
4.2、统计出男生最高分
4.3、统计出女生最高分
4.4、分别统计出男生和女生的分数前三名
4.5、统计出分数在500分以上的人数
4.7、统计出分数在300分以下的人中男女各占多少
def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder().master("local[*]").appName("day04").getOrCreate()
    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")
    val frame: DataFrame = spark.read.csv("F:\\第四学期的大数据资料\\day02四月份资料\\第二周\\day05\\4.16号练习题50道2.0\\student_score")
    import spark.implicits._
    //将RDD转成toDF
    val personDF: DataFrame = frame.toDF("id", "name", "sex", "classs", "score")
    //打印数据
    personDF.createOrReplaceTempView("student")
    //4.1、统计出每个班级的最高分数
    spark.sql("select classs,max(score) from student group by classs ").show()
    //4.2、统计出男生最高分
    spark.sql("select sex,max(score) from student where sex = '男' group by sex").show()
    //4.3、统计出女生最高分
    spark.sql("select sex,max(score) from student where sex = '女' group by sex").show()
    //4.4、分别统计出男生和女生的分数前三名
    spark.sql("select name,classs,score,sex,row_number() over(partition by sex order by score desc) rk from student having rk<=3 ").show()
    //4.5、统计出分数在500分以上的人数
    spark.sql("select count(score) from student where score > 500 ").show()
    //4.7、统计出分数在300分以下的人中男女各占多少
    spark.sql("select sex,count(sex) from (select * from student where score<300)  group by sex").show()
  }
5.请使用Spark sql读取class_info文件夹写的csv文件
5.1、统计出哪个院系的专业最多
5.2、统计出计算机学院中有多少专业
5.3、统计出经济管理学院的会计和工商管理的班级数
5.4、分别统计出每个学院的班级最多的专业
5.5、统计出班级编号以2开头的所有的专业名称
def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder().master("local[*]").appName("day05").getOrCreate()
    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")
    val frame: DataFrame = spark.read.csv("F:\\第四学期的大数据资料\\day02四月份资料\\第二周\\day05\\4.16号练习题50道2.0\\class_info")
    import spark.implicits._
    //将RDD转成toDF
    val personDF: DataFrame = frame.toDF("id", "name", "date", "classs")
    //打印数据
    personDF.createOrReplaceTempView("classI")
    //5.1、统计出哪个院系的专业最多
    //spark.sql("select classs,max(name) from classI group by classs").show()
    //5.2、统计出计算机学院中有多少专业
    // spark.sql("select count(name) from classI where classs ='计算机学院'").show()
    //5.3、统计出经济管理学院的会计和工商管理的班级数
    //spark.sql("select subStr(name,0,2),count(*) from classI where classs ='经济管理学院' and name like '会计%' or name like '工商管理%' group by subStr(name,0,2)").show()
    //5.4、分别统计出每个学院的班级最多的专业
   // spark.sql("select max(name),classs from classI group by classs").show()
    //5.5、统计出班级编号以2开头的所有的专业名称
    spark.sql("select id,name from classI where id like '_2%'").show()
  }
以下是sparksql的练习题
package demo02

import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}

object day006 {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("day006").master("local").getOrCreate()
    import spark.implicits._
    val jdbcDF1 = spark.read
      .format("jdbc")
      .option("url", "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8")
      .option("dbtable", "student")
      .option("user", "root")
      .option("password", "root")
      .load()

    val frame1: DataFrame = jdbcDF1.toDF()
    frame1.createOrReplaceTempView("student")

    val jdbcDF2 = spark.read
      .format("jdbc")
      .option("url", "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8")
      .option("dbtable", "Score")
      .option("user", "root")
      .option("password", "root")
      .load()
    val frame2: DataFrame = jdbcDF2.toDF()
    frame2.createOrReplaceTempView("Score")

    val jdbcDF3 = spark.read
      .format("jdbc")
      .option("url", "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8")
      .option("dbtable", "Course")
      .option("user", "root")
      .option("password", "root")
      .load()
    val frame3: DataFrame = jdbcDF3.toDF()
    frame3.createOrReplaceTempView("Course")

    val jdbcDF4 = spark.read
      .format("jdbc")
      .option("url", "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8")
      .option("dbtable", "teacher")
      .option("user", "root")
      .option("password", "root")
      .load()
    val frame4: DataFrame = jdbcDF4.toDF()
    frame4.createOrReplaceTempView("teacher")

    //6、查询Student表中“95031”班或性别为“女”的同学记录。
    // spark.sql("select * from student where  Class = 95031 and Ssex ='女'").show()
    //7、以Class降序,升序查询Student表的所有记录。
    // spark.sql("select * from student  order by Class desc").show()
    // 8、以Cno升序、Degree降序查询Score表的所有记录。
    //  spark.sql("select * from Score order by Cno asc,Degree desc").show()
    //9、查询“95031”班的学生。
    // spark.sql("select * from student where Class = 95031").show()
    //    10、查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
    // spark.sql("select SNO,CNO from Score where Degree=(select MAX(Degree) from Score)").show()
    //    11、查询每门课的平均成绩。
    // spark.sql("select Cno,AVG(Degree)  from Score group by Cno").show()
    //    12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
    //spark.sql("select AVG(Degree ) from Score where Cno like '3%' group by Cno having COUNT(Cno)>4").show()
    //    13、查询分数大于70,小于90的Sno列。
    // spark.sql("select sno from Score where Degree between 70 and 90").show()
    //    14、查询所有学生的Sname、Cno和Degree列。
    // spark.sql("select Sname,Cno,Degree from student join Score on student.Sno=Score.Sno").show()
    //    15、查询所有学生的Sno、Cname和Degree列。
    //spark.sql("select Sno,Cname,degree from Score join Course on Course.Cno=Score.Cno").show()
    //    16、查询所有学生的Sname、Cname和Degree列。
    //spark.sql("select student.Sname,Cname,degree from student join Score on student.Sno=Score.Sno join Course on Course.Cno=Score.Cno").show()
    //    17、查询“95033”班学生的平均分。
    //spark.sql("select AVG(Degree) from Score,student where student.Sno=Score.Sno and Class='95033'").show()
    //    18、查询所有选修“计算机导论”课程的“女”同学的成绩表。
    //spark.sql("select Sno,Degree from Score where Sno in (select Sno from student where Ssex='女') and Cno in (select Cno from Course where Cname='计算机导论')").show()
    //    19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
    //spark.sql("select * from student,Score where Score.Cno='3-105' and student.Sno=Score.Sno and Score.Degree>(select Degree from Score where Cno='3-105' and Sno='109')").show()
    //    20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。
    // spark.sql("select * from Score a where Degree <(select MAX(degree) from Score b where a.Cno=b.Cno) and Sno in(select Sno from Score group by Sno having count(*)>1)").show()
    //    21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
    //spark.sql("select * from student,Score where student.Sno=Score.Sno and Score.Degree>(select Degree from Score where Cno='3-105' and Sno='109')").show()
    //    22、查询和学号为105的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
    //spark.sql("select Sno,Sname,Sbirthday from student where year(student.Sbirthday)=(select year(Sbirthday) from student where Sno='105')").show()
    //    23、查询“张旭“教师任课的学生成绩
    //spark.sql("select Degree from Score,Teacher,Course where Teacher.Tname='张旭' and Teacher.Tno=Course.Tno and Course.Cno=Score.Cno").show()
    //    24、查询选修某课程的同学人数多于4人的教师姓名。
    //spark.sql("select Tname from Teacher where Tno in (select Tno from Course where Cno in (select Cno from Score group by Cno having COUNT(*)>4))").show()
    //    25、查询95033班和95031班全体学生的记录。
    // spark.sql("select * from student where Class='95033' or Class='95031'").show()
    //    26、查询存在有85分以上成绩的课程Cno.
    // spark.sql("select distinct cno from Score where Degree>85").show()
    //    27、查询出“计算机系“教师所教课程的成绩表。
    //spark.sql("select sno,Cno ,Degree from Score where Cno in (select Cno from Course where Tno in (select tno from Teacher where Depart='计算机系'))").show()
    //    28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
    //spark.sql("select Tname,Prof from Teacher a where Prof not in(select Prof from Teacher b where a.Depart!=b.Depart)").show()
    //    29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
    //spark.sql("select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and b.Sno=a.Sno)>=(select Degree from Score c where Cno='3-245' and c.Sno=a.Sno) order by Degree desc").show()
    //    30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
    //spark.sql("select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and b.Sno=a.Sno)>(select Degree from Score c where Cno='3-245' and c.Sno=a.Sno)").show()
    //    31、查询所有教师和同学的name、sex和birthday.
    //spark.sql("select distinct Sname as name,Ssex as sex,Sbirthday as birthday from student union select distinct Tname as name,Tsex as sex,Tbirthady as birthday from Teacher").show()
    //    32、查询所有“女”教师和“女”同学的name、sex和birthday.
    //spark.sql("select distinct Sname as name,Ssex as sex,Sbirthday as birthday from student where Ssex='女' union select distinct Tname as name,Tsex as sex,Tbirthady as birthday from Teacher where Tsex='女'").show()
    //    33、查询成绩比该课程平均成绩低的同学的成绩表。
    //spark.sql("select Sno,Cno,Degree from Score a where a.Degree<(select AVG(Degree) from Score b where a.Cno=b.Cno)").show()
    //    34、查询所有任课教师的Tname和Depart.
    //spark.sql("select Tname,Depart from Teacher where tno in (select tno from course where Cno in (select distinct Cno from Score))").show()
    //    35、查询所有未讲课的教师的Tname和Depart.
    //spark.sql("select Tname,Depart from Teacher where Tname not in (select distinct Tname from Teacher,Course,Score where Teacher.Tno=Course.Tno and Course.Cno=Score.Cno)").show()
    //    36、查询至少有2名男生的班号。
    //spark.sql("select Class FROM student where Ssex='男' group by Class having COUNT(*)>1").show()
    //    37、查询Student表中不姓“王”的同学记录。
    // spark.sql("select * from student where Sname not like '王%'").show()
    //    38、查询Student表中每个学生的姓名和年龄。将函数运用到spark sql中去计算,可以直接拿String的类型计算不需要再转换成数值型 默认是会转换成Double类型计算浮点型转整型
    // spark.sql("select Sname,YEAR(GETDATE())-year(Sbirthday) from student").show()
    //    39、查询Student表中最大和最小的Sbirthday日期值。 时间格式最大值,最小值
    // spark.sql("select MAX(Sbirthday) as 最大,MIN(Sbirthday) as 最小 from student").show()
    //    40、以班号和年龄从大到小的顺序查询Student表中的全部记录。 查询结果排序
    // spark.sql("select * from student order by Class desc,Sbirthday asc").show()
    //    41、查询“男”教师及其所上的课程。
    // spark.sql("select Tname,Cname from Teacher,Course where Tsex='男' and Teacher.Tno=Course.Tno").show()
    //    42、查询最高分同学的Sno、Cno和Degree列。
    //spark.sql("select Sno,Cno,Degree from Score where degree=(select MAX(Degree)from Score)").show()
    //    43、查询和“李军”同性别的所有同学的Sname.
    // spark.sql("select Sname from student where Ssex=(select Ssex from student where Sname='李军') and Sname not in ('李军')").show()
    //    44、查询和“李军”同性别并同班的同学Sname.
    //spark.sql("select Sname from student where Ssex=(select Ssex from student where Sname='李军') and Sname not in ('李军') and Class=(select Class from student where Sname='李军')").show()
    //    45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
    // spark.sql("select Sno,Degree from Score where Sno in (select Sno from student where Ssex='男') and Cno in (select Cno from Course where Cname='计算机导论')").show()
    //    46、查询Student表中的所有记录的Sname、Ssex和Class列。
    //spark.sql("select Sname,Ssex,Class from student").show()
    //    47、查询教师所有的单位即不重复的Depart列。
    // spark.sql("select distinct Depart from Teacher").show()
    //    48、查询Student表的所有记录
    //spark.sql("select * from student").show()
    //    49、查询Score表中成绩在60到80之间的所有记录。
    //spark.sql("select * from Score where Degree between 60 and 80").show()
    //    50、查询Score表中成绩为85,86或88的记录。
    spark.sql("select * from Score where Degree in (85,86,88)").show()
  }
}

上一篇:2021-10-30


下一篇:MySQL57--SQL语句练习03