十年磨一剑,SparkSQL来一题!

2021-01-27 16:04:58 浏览数 (1)

之前推出过一期关于Spark的练习,反响还不错。而最近博主又写了关于SparkSQL,SparkStreamingStructured Streaming的内容,为了巩固大家的基础,提升实战的能力,故备下了一道综合性比较全面的题,希望大家能够受用。


准备数据

student.txt

字段从左到右依次代表:

代码语言:javascript复制
	学号   学生姓名	  学生性别	学生出生年月  学生所在班级
代码语言:javascript复制
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.txt

代码语言:javascript复制
	课程号   课程名称	 教工编号
代码语言:javascript复制
3-105	计算机导论	825
3-245	操作系统	804
6-166	数字电路	856
9-888	高等数学	831

score.txt

代码语言:javascript复制
	学号   课程号	 成绩
代码语言:javascript复制
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.txt

代码语言:javascript复制
	教工编号   教工姓名	 教工性别		教工出生年月	职称		教工所在部门 
代码语言:javascript复制
804	李诚	男	1958-12-02	副教授	计算机系
856	张旭	男	1969-03-12	讲师	电子工程系
825	王萍	女	1972-05-05	助教	计算机系
831	刘冰	女	1977-08-14	助教	电子工程系

上题

1.查询Student表中“95031”班或性别为“女”的同学记录。
2.以Class降序,升序查询Student表的所有记录。
3.以Cno升序、Degree降序查询Score表的所有记录。
4.查询“95031”班的学生。
5.查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
6.查询每门课的平均成绩。
7.查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
8.查询分数大于70,小于90的Sno列。
9.查询所有学生的Sname、Cno和Degree列。
10.查询所有学生的Sno、Cname和Degree列。
11.查询所有学生的Sname、Cname和Degree列。
12.查询“95033”班学生的平均分。
13.查询所有选修“计算机导论”课程的“女”同学的成绩表。
14.查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
15.查询score中选学多门课程的同学中分数为非最高分成绩的记录。
16.查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
17.查询和学号为105的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
18.查询“张旭“教师任课的学生成绩
19.查询选修某课程的同学人数多于4人的教师姓名
20.查询95033班和95031班全体学生的记录
21.查询存在有85分以上成绩的课程Cno
22.查询出“计算机系“教师所教课程的成绩表
23.查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof
24.查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序
25.查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree
26.查询所有教师和同学的name、sex和birthday
27.查询所有“女”教师和“女”同学的name、sex和birthday.
28.查询成绩比该课程平均成绩低的同学的成绩表
29.查询所有任课教师的Tname和Depart
30.查询所有未讲课的教师的Tname和Depart
31.查询至少有2名男生的班号
32.查询Student表中不姓“王”的同学记录
33.查询Student表中每个学生的姓名和年龄。
34.查询Student表中最大和最小的Sbirthday日期值。(时间格式最大值,最小值)
35.以班号和年龄从大到小的顺序查询Student表中的全部记录。 查询结果排序
36.查询“男”教师及其所上的课程
37.查询最高分同学的Sno、Cno和Degree列
38.查询和“李军”同性别的所有同学的Sname
39.查询和“李军”同性别并同班的同学Sname
40.查询所有选修“计算机导论”课程的“男”同学的成绩表
41.查询Student表中的所有记录的Sname、Ssex和Class列
42.查询教师所有的单位即不重复的Depart列
43.查询Student表的所有记录
44.查询Score表中成绩在60到80之间的所有记录
45.查询Score表中成绩为85,86或88的记录

答案

声明:下面的答案均为博主自己的解法,结果均经得起测试,如有纰漏,烦请大佬指点。


代码语言:javascript复制
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{Dataset, SparkSession}

/*
 * @Auther: Alice菌
 * @Date: 2020/4/18 08:14
 * @Description: 
    流年笑掷 未来可期。以梦为马,不负韶华!
 */
object demo06 {

  // 定义样例类封装数据
  case class Student(Sno:String,Sname:String,Ssex:String,Sbirthday:String,Class:String)
  case class Course(Cno:String,Cname:String,Tno:String)
  case class Score(Sno:String,Cno:String,Degree:String)
  case class Teacher(Tno:String,Tname:String,Tsex:String,Tbirthday:String,Prof:String,Depart:String)


  def main(args: Array[String]): Unit = {


    // 1. 创建SparkSession
    val spark: SparkSession = SparkSession.builder().master("local[*]").appName("demo06").getOrCreate()

    val sc: SparkContext = spark.sparkContext

    // 设置日志级别
    sc.setLogLevel("WARN")

    // 读取test文件
   val rdd1: RDD[String] = sc.textFile("E:\2020大数据新学年\BigData\05-Spark\0417\4.16号练习题50道2.0\data\student.txt")
   val rdd2: RDD[String] = sc.textFile("E:\2020大数据新学年\BigData\05-Spark\0417\4.16号练习题50道2.0\data\course.txt")
   val rdd3: RDD[String] = sc.textFile("E:\2020大数据新学年\BigData\05-Spark\0417\4.16号练习题50道2.0\data\score.txt")
   val rdd4: RDD[String] = sc.textFile("E:\2020大数据新学年\BigData\05-Spark\0417\4.16号练习题50道2.0\data\teacher.txt")

    val student: RDD[Student] = rdd1.map(x=>{val str = x.split("t");Student(str(0),str(1),str(2),str(3),str(4))})
    val course: RDD[Course] = rdd2.map(x=>{val str = x.split("t");Course(str(0),str(1),str(2))})
    val score: RDD[Score] = rdd3.map(x=>{val str = x.split("t");Score(str(0),str(1),str(2))})
    val teacher: RDD[Teacher] = rdd4.map(x=>{val str = x.split("t");Teacher(str(0),str(1),str(2),str(3),str(4),str(5))})

    // 导入隐式转换
    import spark.implicits._

    // 将RDD转换成DF
    val stuframe = student.toDF()
    val couframe = course.toDF()
    val scoframe = score.toDF()
    val teaframe = teacher.toDF()

    // 创建临时表
    stuframe.createOrReplaceTempView("student")
    couframe.createOrReplaceTempView("course")
    scoframe.createOrReplaceTempView("score")
    teaframe.createOrReplaceTempView("teacher")


    /* 6. 查询Student表中“95031”班或性别为“女”的同学记录*/
    spark.sql("Select * from student where sno = '95031' or ssex = '女'").show()
    // --- ----- ---- ---------- ----- 
    //|Sno|Sname|Ssex| Sbirthday|Class|
    // --- ----- ---- ---------- ----- 
    //|107|   王丽|   女|1976-01-23|95033|
    //|109|   王芳|   女|1975-02-10|95031|
    // --- ----- ---- ---------- ----- 

    /* 7. 以Class降序,升序查询Student表的所有记录 */
    spark.sql("Select * from student order by class desc").show()
    // --- ----- ---- ---------- ----- 
    //|Sno|Sname|Ssex| Sbirthday|Class|
    // --- ----- ---- ---------- ----- 
    //|107|   王丽|   女|1976-01-23|95033|
    //|101|   李军|   男|1976-02-20|95033|
    //|108|   丘东|   男|1977-09-01|95033|
    //|105|   匡明|   男|1975-10-02|95031|
    //|109|   王芳|   女|1975-02-10|95031|
    //|103|   陆君|   男|1974-06-03|95031|
    // --- ----- ---- ---------- ----- 

    /* 8. 以Cno升序、Degree降序查询Score表的所有记录。 */
    spark.sql("Select * from score order by cno,degree desc").show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|103|3-105|    92|
    //|107|3-105|    91|
    //|105|3-105|    88|
    //|108|3-105|    78|
    //|109|3-105|    76|
    //|101|3-105|    64|
    //|103|3-245|    86|
    //|105|3-245|    75|
    //|109|3-245|    68|
    //|101|6-166|    85|
    //|108|6-166|    81|
    //|107|6-166|    79|
    // --- ----- ------ 

    /* 9. 查询“95031”班的学生。 */
    spark.sql("Select sname from student where class = '95031'").show()
    // ----- 
    //|sname|
    // ----- 
    //|   匡明|
    //|   王芳|
    //|   陆君|
    // ----- 

    /* 10. 查询Score表中的最高分的学生学号和课程号。(子查询或者排序) */
    spark.sql("Select sno,cno from score order by degree desc limit 1").show()
    // --- ----- 
    //|sno|  cno|
    // --- ----- 
    //|103|3-105|
    // --- ----- 

    /* 11. 查询每门课的平均成绩。  */
    spark.sql("Select first(course.Cname),avg(degree) from score,course where score.Cno = course.Cno  group by score.Cno").show()
    // ------------------- --------------------------- 
    //|first(Cname, false)|avg(CAST(degree AS DOUBLE))|
    // ------------------- --------------------------- 
    //|               数字电路|          81.66666666666667|
    //|               操作系统|          76.33333333333333|
    //|              计算机导论|                       81.5|
    // ------------------- --------------------------- 

    /* 12. 查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。  */
    spark.sql("Select first(cno),avg(Degree) from score where cno like '3%' group by cno having count(cno) >= 5").show()
    // ----------------- --------------------------- 
    //|first(cno, false)|avg(CAST(Degree AS DOUBLE))|
    // ----------------- --------------------------- 
    //|            3-105|                       81.5|
    // ----------------- --------------------------- 

    /* 13.查询分数大于70,小于90的Sno列  */
    spark.sql("Select sno from score where Degree > 70 and Degree < 90 ").show()
    // --- 
    //|sno|
    // --- 
    //|103|
    //|105|
    //|105|
    //|109|
    //|108|
    //|101|
    //|107|
    //|108|
    // --- 

    /* 14.查询所有学生的Sname、Cno和Degree列。 */
    spark.sql("select sname,cno,degree from score,student where score.sno = student.sno").show()
    // ----- ----- ------ 
    //|sname|  cno|degree|
    // ----- ----- ------ 
    //|   李军|3-105|    64|
    //|   李军|6-166|    85|
    //|   王丽|3-105|    91|
    //|   王丽|6-166|    79|
    //|   陆君|3-245|    86|
    //|   陆君|3-105|    92|
    //|   丘东|3-105|    78|
    //|   丘东|6-166|    81|
    //|   匡明|3-245|    75|
    //|   匡明|3-105|    88|
    //|   王芳|3-245|    68|
    //|   王芳|3-105|    76|
    // ----- ----- ------ 

    /* 15.查询所有学生的Sno、Cname和Degree列。 */
    spark.sql("select sno,cname,degree from score,course where score.cno=course.cno").show()
    // --- ----- ------ 
    //|sno|cname|degree|
    // --- ----- ------ 
    //|101| 数字电路|    85|
    //|107| 数字电路|    79|
    //|108| 数字电路|    81|
    //|103| 操作系统|    86|
    //|105| 操作系统|    75|
    //|109| 操作系统|    68|
    //|103|计算机导论|    92|
    //|105|计算机导论|    88|
    //|109|计算机导论|    76|
    //|101|计算机导论|    64|
    //|107|计算机导论|    91|
    //|108|计算机导论|    78|
    // --- ----- ------ 

    /* 16.查询所有学生的Sname、Cname和Degree列。 */
    spark.sql(
      """
        |select sname,cname,degree from score,course,student
        |where score.cno = course.cno and student.sno = score.sno
      """.stripMargin).show()
     // ----- ----- ------ 
    //|sname|cname|degree|
    // ----- ----- ------ 
    //|   李军| 数字电路|    85|
    //|   李军|计算机导论|    64|
    //|   王丽| 数字电路|    79|
    //|   王丽|计算机导论|    91|
    //|   陆君| 操作系统|    86|
    //|   陆君|计算机导论|    92|
    //|   丘东| 数字电路|    81|
    //|   丘东|计算机导论|    78|
    //|   匡明| 操作系统|    75|
    //|   匡明|计算机导论|    88|
    //|   王芳| 操作系统|    68|
    //|   王芳|计算机导论|    76|
    // ----- ----- ------ 

    /* 17.查询“95033”班学生的平均分。*/
    spark.sql("select first(class),avg(Degree) from student,score where student.sno = score.sno and class = '95033'").show()
    // ------------------- --------------------------- 
    //|first(class, false)|avg(CAST(Degree AS DOUBLE))|
    // ------------------- --------------------------- 
    //|              95033|          79.66666666666667|
    // ------------------- --------------------------- 

    /* 18.查询所有选修“计算机导论”课程的“女”同学的成绩表。 */
    spark.sql(
      """
        |select sname,cname,ssex,Degree from student,course,score
        |where student.sno = score.sno and course.cno=score.cno
        |and ssex = "女" and cname = "计算机导论"
      """.stripMargin).show()
    //|sname|cname|ssex|Degree|
    // ----- ----- ---- ------ 
    //|   王丽|计算机导论|   女|    91|
    //|   王芳|计算机导论|   女|    76|
    // ----- ----- ---- ------ 

    /* 19.查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。*/
    spark.sql(
      """
        |select * from score where cno = "3-105" and degree > (select degree from score where sno = "109" and cno = "3-105" )
        |
      """.stripMargin).show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|103|3-105|    92|
    //|105|3-105|    88|
    //|107|3-105|    91|
    //|108|3-105|    78|
    // --- ----- ------ 

    /* 20.查询score中选学多门课程的同学中分数为非最高分成绩的记录。  */
//    spark.sql(
//      """
//        |select first(sno),first(cno),first(degree) from score a where sno in
//        |(select sno from score group by sno having count(*)>1)    
//        |and degree<(select max(degree) from score b where a.cno=b.cno)      
//      """.stripMargin).show()
    spark.sql("select * from score a where sno in (select sno from score group by sno having count(*)>1) and degree<(select max(degree) from score b where a.cno=b.cno )").show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|107|6-166|    79|
    //|108|6-166|    81|
    //|105|3-245|    75|
    //|109|3-245|    68|
    //|101|3-105|    64|
    //|107|3-105|    91|
    //|108|3-105|    78|
    //|105|3-105|    88|
    //|109|3-105|    76|
    // --- ----- ------ 

    /* 21.查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 */
     spark.sql("select * from score where degree > (select degree from score where sno = '109' and cno = '3-105')").show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|103|3-245|    86|
    //|103|3-105|    92|
    //|105|3-105|    88|
    //|107|3-105|    91|
    //|108|3-105|    78|
    //|101|6-166|    85|
    //|107|6-166|    79|
    //|108|6-166|    81|
    // --- ----- ------ 

    /* 22. 查询和学号为105的同学同年出生的所有学生的Sno、Sname和Sbirthday列。*/

    spark.udf.register("sub",(str:String,num1:Int,num2:Int)=>str.substring(num1,num2))

    spark.sql("select sno,sname,sbirthday from student where sub(Sbirthday,0,5) = (select sub(Sbirthday,0,5) from student where sno = '105') ").show()
    // --- ----- ---------- 
    //|sno|sname| sbirthday|
    // --- ----- ---------- 
    //|105|   匡明|1975-10-02|
    //|109|   王芳|1975-02-10|
    // --- ----- ---------- 

    /* 23. 查询“张旭“教师任课的学生成绩 */
    spark.sql(
      """
        |select  sno,degree from score,course,teacher
        |where tname = "张旭" and teacher.tno = course.tno
        |and course.Cno = score.Cno
      """.stripMargin).show()
    // --- ------ 
    //|sno|degree|
    // --- ------ 
    //|101|    85|
    //|107|    79|
    //|108|    81|
    // --- ------ 

    /* 24. 查询选修某课程的同学人数多于4人的教师姓名。 */
     spark.sql(
       """
         |select first(tname) from teacher,score,course
         |where teacher.tno = course.tno
         |and course.Cno = score.Cno
         |group by score.Cno having count(score.Cno) > 4
       """.stripMargin).show()

    // ------------------- 
    //|first(tname, false)|
    // ------------------- 
    //|                 王萍|
    // ------------------- 

    /* 25. 查询95033班和95031班全体学生的记录。 */
     spark.sql("select * from student where class= '95033' or class = '95031'").show()
    // --- ----- ---- ---------- ----- 
    //|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|
    // --- ----- ---- ---------- ----- 

    /* 26. 查询存在有85分以上成绩的课程Cno.  */
     spark.sql("select distinct cno from score where degree >= 85").show()
    // ----- 
    //|  cno|
    // ----- 
    //|6-166|
    //|3-245|
    //|3-105|
    // ----- 

    /* 27. 查询出“计算机系“教师所教课程的成绩表。 */
     spark.sql(
       """
         |select  score.*  from score,Course,teacher
         |where  teacher.tno = course.tno
         |and course.Cno = score.Cno
         |and teacher.Depart = "计算机系"
       """.stripMargin).show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|103|3-105|    92|
    //|105|3-105|    88|
    //|109|3-105|    76|
    //|101|3-105|    64|
    //|107|3-105|    91|
    //|108|3-105|    78|
    //|103|3-245|    86|
    //|105|3-245|    75|
    //|109|3-245|    68|
    // --- ----- ------ 

    /* 28. 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof */
    spark.sql(
      """
        |select tname,prof from teacher where depart = '计算机系' and prof not in
        |(select prof from teacher where depart = '电子工程系')
      """.stripMargin).show()
    // ----- ---- 
    //|tname|prof|
    // ----- ---- 
    //|   李诚| 副教授|
    // ----- ---- 

    /* 29. 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 */
     spark.sql(
       """
         |select s1.cno,s1.sno,s1.degree from score s1,score s2
         |where s1.cno = "3-105" and s2.cno = "3-245"
         |and s1.Sno = s2.Sno
         |and s1.degree > s2. degree
         |order by s1.degree desc
       """.stripMargin).show()

    // ----- --- ------ 
    //|  cno|sno|degree|
    // ----- --- ------ 
    //|3-105|103|    92|
    //|3-105|105|    88|
    //|3-105|109|    76|
    // ----- --- ------ 

    /* 30. 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. */
    spark.sql(
      """
        |select cno,sno,degree from score
        |where cno = "3-105" and degree > (select max(degree) from score where cno = "3-245")
      """.stripMargin).show()
    // ----- --- ------ 
    //|  cno|sno|degree|
    // ----- --- ------ 
    //|3-105|103|    92|
    //|3-105|105|    88|
    //|3-105|107|    91|
    // ----- --- ------ 

    /* 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,Tbirthday as birthday from Teacher
         |
       """.stripMargin).show()
    // ---- --- ---------- 
    //|name|sex|  birthday|
    // ---- --- ---------- 
    //|  李诚|  男|1958-12-02|
    //|  张旭|  男|1969-03-12|
    //|  王萍|  女|1972-05-05|
    //|  李军|  男|1976-02-20|
    //|  匡明|  男|1975-10-02|
    //|  刘冰|  女|1977-08-14|
    //|  陆君|  男|1974-06-03|
    //|  王芳|  女|1975-02-10|
    //|  王丽|  女|1976-01-23|
    //|  丘东|  男|1977-09-01|
    // ---- --- ---------- 

    /* 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,Tbirthday as birthday from Teacher where Tsex = "女"
        |
      """.stripMargin).show()
    // ---- --- ---------- 
    //|name|sex|  birthday|
    // ---- --- ---------- 
    //|  王萍|  女|1972-05-05|
    //|  刘冰|  女|1977-08-14|
    //|  王芳|  女|1975-02-10|
    //|  王丽|  女|1976-01-23|
    // ---- --- ---------- 

    /* 33. 查询成绩比该课程平均成绩低的同学的成绩表。 */
     spark.sql(
       """
         |select * from score s1
         |where degree < (select avg(degree) from score s2 where s1.Cno = s2.Cno)
       """.stripMargin).show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|107|6-166|    79|
    //|108|6-166|    81|
    //|105|3-245|    75|
    //|109|3-245|    68|
    //|109|3-105|    76|
    //|101|3-105|    64|
    //|108|3-105|    78|
    // --- ----- ------ 

    /* 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) )
       """.stripMargin).show()
    // ----- ------ 
    //|tname|depart|
    // ----- ------ 
    //|   张旭| 电子工程系|
    //|   王萍|  计算机系|
    //|   李诚|  计算机系|
    // ----- ------ 

    /* 35. 查询所有未讲课的教师的Tname和Depart.  */
   spark.sql(
     """
       |select tname,depart from teacher
       |where tno not in (select tno from course where cno in (select distinct cno from score) )
     """.stripMargin).show()
    // ----- ------ 
    //|tname|depart|
    // ----- ------ 
    //|   刘冰| 电子工程系|
    // ----- ------ 

    /* 36. 查询至少有2名男生的班号。 */
    spark.sql(
      """
        |select class from student
        |where ssex = "男"
        |group by class having count(class) >= 2
      """.stripMargin).show()
    // ----- 
    //|class|
    // ----- 
    //|95033|
    //|95031|
    // ----- 

    /* 37. 查询Student表中不姓“王”的同学记录。 */
     spark.sql(
       """
         |select * from student
         |where sname not like "王%"
       """.stripMargin).show()
    // --- ----- ---- ---------- ----- 
    //|Sno|Sname|Ssex| Sbirthday|Class|
    // --- ----- ---- ---------- ----- 
    //|108|   丘东|   男|1977-09-01|95033|
    //|105|   匡明|   男|1975-10-02|95031|
    //|101|   李军|   男|1976-02-20|95033|
    //|103|   陆君|   男|1974-06-03|95031|
    // --- ----- ---- ---------- ----- 

    /* 38. 查询Student表中每个学生的姓名和年龄。将函数运用到spark sql中去计算,可以直接拿String的类型计算不需要再转换成数值型 默认是会转换成Double类型计算浮点型转整型 */

    spark.sql(
      """
        |select Sname,year(current_date)-year(Sbirthday) from student
      """.stripMargin).show()
    // ----- ------------------------------------------------------ 
    //|Sname|(year(current_date()) - year(CAST(Sbirthday AS DATE)))|
    // ----- ------------------------------------------------------ 
    //|   丘东|                                                    43|
    //|   匡明|                                                    45|
    //|   王丽|                                                    44|
    //|   李军|                                                    44|
    //|   王芳|                                                    45|
    //|   陆君|                                                    46|
    // ----- ------------------------------------------------------ 

    /* 39. 查询Student表中最大和最小的Sbirthday日期值。 时间格式最大值,最小值*/
    spark.sql(
      """
        |select max(Sbirthday),min(Sbirthday) from student
      """.stripMargin).show()
    // -------------- -------------- 
    //|max(Sbirthday)|min(Sbirthday)|
    // -------------- -------------- 
    //|    1977-09-01|    1974-06-03|
    // -------------- -------------- 

    /* 40. 以班号和年龄从大到小的顺序查询Student表中的全部记录。 查询结果排序*/
    spark.sql(
      """
        |select * from student order by class desc,year(current_date)-year(Sbirthday) desc
      """.stripMargin).show()
    // --- ----- ---- ---------- ----- 
    //|Sno|Sname|Ssex| Sbirthday|Class|
    // --- ----- ---- ---------- ----- 
    //|107|   王丽|   女|1976-01-23|95033|
    //|101|   李军|   男|1976-02-20|95033|
    //|108|   丘东|   男|1977-09-01|95033|
    //|103|   陆君|   男|1974-06-03|95031|
    //|105|   匡明|   男|1975-10-02|95031|
    //|109|   王芳|   女|1975-02-10|95031|
    // --- ----- ---- ---------- ----- 

    /* 41. 查询“男”教师及其所上的课程。 */
    spark.sql(
      """
        |select cname from course,teacher
        |where teacher.Tno = course.Tno and Tsex = "男"
      """.stripMargin).show()
    // ----- 
    //|cname|
    // ----- 
    //| 数字电路|
    //| 操作系统|
    // ----- 

    /* 42. 查询最高分同学的Sno、Cno和Degree列。  */
    spark.sql(
      """
        |select * from score
        |where degree = (select max(degree) from score)
      """.stripMargin).show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|103|3-105|    92|
    // --- ----- ------ 

    /* 43. 查询和“李军”同性别的所有同学的Sname.*/
    spark.sql(
      """
        |select sname from student
        |where ssex = (select ssex from student where sname = "李军") and sname != "李军"
      """.stripMargin).show()
    // ----- 
    //|sname|
    // ----- 
    //|   丘东|
    //|   匡明|
    //|   李军|
    //|   陆君|
    // ----- 

    /* 44. 查询和“李军”同性别并同班的同学Sname. */
    spark.sql(
      """
        |select distinct s1.sname from student s1,student s2
        |where s1.ssex = s2.ssex and s1.class = s2.class
        |and s1.sname != "李军"
      """.stripMargin).show()
    // ----- 
    //|sname|
    // ----- 
    //|   陆君|
    //|   匡明|
    //|   王芳|
    //|   王丽|
    //|   丘东|
    // ----- 

    /* 45. 查询所有选修“计算机导论”课程的“男”同学的成绩表。 */
    spark.sql(
      """
        |select degree from score,student,course
        |where score.cno = course.cno
        |and score.sno = student.sno
        |and student.ssex = "男"
        |and course.cname = "计算机导论"
      """.stripMargin).show()
    // ------ 
    //|degree|
    // ------ 
    //|    64|
    //|    92|
    //|    78|
    //|    88|
    // ------ 

    /* 46. 查询Student表中的所有记录的Sname、Ssex和Class列。 */
     spark.sql(
       """
         |select sname,ssex,class from student
       """.stripMargin).show()
    // ----- ---- ----- 
    //|   丘东|   男|95033|
    //|   匡明|   男|95031|
    //|   王丽|   女|95033|
    //|   李军|   男|95033|
    //|   王芳|   女|95031|
    //|   陆君|   男|95031|
    // ----- ---- ----- 

    /* 47. 查询教师所有的单位即不重复的Depart列。*/
     spark.sql(
       """
         |select distinct depart from teacher
       """.stripMargin).show()
    // ------ 
    //|depart|
    // ------ 
    //| 电子工程系|
    //|  计算机系|
    // ------ 

    /* 48. 查询Student表的所有记录 */
    spark.sql(
      """
        |select * from student
      """.stripMargin).show()
    // --- ----- ---- ---------- ----- 
    //|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|
    // --- ----- ---- ---------- ----- 

    /* 49. 查询Score表中成绩在60到80之间的所有记录。 */
    spark.sql(
      """
        |select * from score where degree > 60 and degree < 80
      """.stripMargin).show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|105|3-245|    75|
    //|109|3-245|    68|
    //|109|3-105|    76|
    //|101|3-105|    64|
    //|108|3-105|    78|
    //|107|6-166|    79|
    // --- ----- ------ 

    /* 50. 查询Score表中成绩为85,86或88的记录。 */
     spark.sql(
       """
         |select * from score where Degree in (85,86,88)
       """.stripMargin).show()
    // --- ----- ------ 
    //|Sno|  Cno|Degree|
    // --- ----- ------ 
    //|103|3-245|    86|
    //|105|3-105|    88|
    //|101|6-166|    85|
    // --- ----- ------ 


  }
}

结语

好了,本篇关于SparkSQL的练习题就分享到这里,后续还会继续分享其他类型的习题,受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波(^U^)ノ~YO

txt

0 人点赞