使用idea练习Spark SQL经典练习50题

  • 一.准备文件
    • (1)课程表(course.txt)
    • (2)成绩表(score.txt)
    • (3)学生表(student.txt)
    • (4)教师表(teacher.txt)
  • 二.创建DataFrame
    • 1.创建SparkSession
    • 2.创建表的样例类
    • 3.创建RowRDD
    • 4.创建DataFrame
  • 三.练习题代码
  • 四.练习题过程及其对应运行结果
    • (1)查询"01"课程比"02"课程成绩高的学生的信息及课程分数
    • (2)查询"01"课程比"02"课程成绩低的学生的信息及课程分数
    • (3)查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
    • (4)查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
    • (5)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
    • (6)查询"李"姓老师的数量
    • (7)查询学过"张三"老师授课的同学的信息
    • (8)查询没学过"张三"老师授课的同学的信息
    • (9)查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
    • (10)查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
    • (11)查询没有学全所有课程的同学的信息
    • (12)查询至少有一门课与学号为"01"的同学所学相同的同学的信息
    • (13)查询和"01"号的同学学习的课程完全相同的其他同学的信息
    • (14)查询没学过"张三"老师讲授的任一门课程的学生姓名
    • (15)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
    • (16)检索"01"课程分数小于60,按分数降序排列的学生信息
    • (17)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
    • (18)查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
    • (19)按各科成绩进行排序,并显示排名
    • (20)查询学生的总成绩并进行排名
    • (21)查询不同老师所教不同课程平均分从高到低显示
    • (22)查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
    • (23)统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比
    • (24)查询学生平均成绩及其名次
    • (25)查询各科成绩前三名的记录
    • (26)查询每门课程被选修的学生数
    • (27)查询出只有两门课程的全部学生的学号和姓名
    • (28)查询男生、女生人数
    • (29)查询名字中含有"风"字的学生信息
    • (30)查询同名同性学生名单,并统计同名人数
    • (31)查询1990年出生的学生名单
    • (32)查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
    • (33)查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩
    • (34)查询课程名称为"数学",且分数低于60的学生姓名和分数
    • (35)查询所有学生的课程及分数情况
    • (36)查询任何一门课程成绩在70分以上的学生姓名、课程名称和分数
    • (37)查询课程不及格的学生
    • (38)查询课程编号为01且课程成绩在80分以上的学生的学号和姓名
    • (39)求每门课程的学生人数
    • (40)查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩
    • (41)查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
    • (42)查询每门课程成绩最好的前三名
    • (43)统计每门课程的学生选修人数(超过5人的课程才统计)
    • (45)查询选修了全部课程的学生信息
    • (46)查询各学生的年龄(周岁)
    • (47)查询本周过生日的学生
    • (48)查询下周过生日的学生
    • (49)查询本月过生日的学生
    • (50)查询12月份过生日的学生

一.准备文件

(1)课程表(course.txt)

01   语文  02
02  数学  01
03  英语  03

(2)成绩表(score.txt)

01   01  80
01  02  90
01  03  99
02  01  70
02  02  60
02  03  80
03  01  80
03  02  80
03  03  80
04  01  50
04  02  30
04  03  20
05  01  76
05  02  87
06  01  31
06  03  34
07  02  89
07  03  98

(3)学生表(student.txt)

01   赵雷  1990-01-01  男
02  钱电  1990-12-21  男
03  孙风  1990-05-20  男
04  李云  1990-08-06  男
05  周梅  1991-12-01  女
06  吴兰  1992-03-01  女
07  郑竹  1989-07-01  女
08  王菊  1990-01-20  女

(4)教师表(teacher.txt)

01   张三
02  李四
03  王五

二.创建DataFrame

1.创建SparkSession

 //TODO:1.创建SparkSessionval spark: SparkSession = SparkSession.builder().master("local[*]").appName(this.getClass.getName).getOrCreate()//通过SparkSession创建SparkContextval sc: SparkContext = spark.sparkContext

2.创建表的样例类

  //学生表case class Student(student_id: Int, student_name: String, birth: String, sex: String)//课程表case class Course(course_id: Int, course_name: String, teacher_id: Int)//教师表case class Teacher(teacher_id: Int, teacher_name: String)//成绩表case class Score(student_id: Int, course_id: Int, score: Int)

3.创建RowRDD

 //TODO:3.创建RDD//学生表val studentRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/student.txt").map(_.split("\\s+"))//课程表val courseRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/course.txt").map(_.split("\\s+"))//教师表val teacherRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/teacher.txt").map(_.split("\\s+"))//成绩表val scoreRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/score.txt").map(_.split("\\s+"))//TODO:4.转成Row类型的RDDval studentRowRDD: RDD[Student] = studentRDD.map(x => Student(x(0).toInt, x(1), x(2), x(3)))val courseRowRDD: RDD[Course] = courseRDD.map(x => Course(x(0).toInt, x(1), x(2).toInt))val teacherRowRDD: RDD[Teacher] = teacherRDD.map(x => Teacher(x(0).toInt, x(1)))val scoreRowRDD: RDD[Score] = scoreRDD.map(x => Score(x(0).toInt, x(1).toInt, x(2).toInt))

4.创建DataFrame

   import spark.implicits._//TODO:5.创建DataFrameval studentDF: DataFrame = studentRowRDD.toDF()val courseDF: DataFrame = courseRowRDD.toDF()val teacherDF: DataFrame = teacherRowRDD.toDF()val scoreDF: DataFrame = scoreRowRDD.toDF()

三.练习题代码

package cn.kgc.homeworkimport org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
import org.apache.spark.sql.functions._object SparkSQL50 {def main(args: Array[String]): Unit = {//TODO:1.创建SparkSessionval spark: SparkSession = SparkSession.builder().master("local[*]").appName(this.getClass.getName).getOrCreate()//通过SparkSession创建SparkContextval sc: SparkContext = spark.sparkContext//TODO:3.创建RDD//学生表val studentRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/student.txt").map(_.split("\\s+"))//课程表val courseRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/course.txt").map(_.split("\\s+"))//教师表val teacherRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/teacher.txt").map(_.split("\\s+"))//成绩表val scoreRDD: RDD[Array[String]] = sc.textFile("data/sparksql50/score.txt").map(_.split("\\s+"))//TODO:4.转成Row类型的RDDval studentRowRDD: RDD[Student] = studentRDD.map(x => Student(x(0).toInt, x(1), x(2), x(3)))val courseRowRDD: RDD[Course] = courseRDD.map(x => Course(x(0).toInt, x(1), x(2).toInt))val teacherRowRDD: RDD[Teacher] = teacherRDD.map(x => Teacher(x(0).toInt, x(1)))val scoreRowRDD: RDD[Score] = scoreRDD.map(x => Score(x(0).toInt, x(1).toInt, x(2).toInt))import spark.implicits._//TODO:5.创建DataFrameval studentDF: DataFrame = studentRowRDD.toDF()val courseDF: DataFrame = courseRowRDD.toDF()val teacherDF: DataFrame = teacherRowRDD.toDF()val scoreDF: DataFrame = scoreRowRDD.toDF()//TODO:6.练习题//具体代码在下方}//TODO:2.创建表的样例类//学生表case class Student(student_id: Int, student_name: String, birth: String, sex: String)//课程表case class Course(course_id: Int, course_name: String, teacher_id: Int)//教师表case class Teacher(teacher_id: Int, teacher_name: String)//成绩表case class Score(student_id: Int, course_id: Int, score: Int)}

四.练习题过程及其对应运行结果

(1)查询"01"课程比"02"课程成绩高的学生的信息及课程分数

  //TODO:6.练习题
//    (1)查询"01"课程比"02"课程成绩高的学生的信息及课程分数:
scoreDF.as("s1").join(scoreDF.as("s2"),"student_id").filter("s1.course_id=1 and s2.course_id=2 and s1.score>s2.score ").join(studentDF,"student_id").show()+----------+---------+-----+---------+-----+------------+----------+---+
|student_id|course_id|score|course_id|score|student_name|     birth|sex|
+----------+---------+-----+---------+-----+------------+----------+---+
|         4|        1|   50|        2|   30|          李云|1990-08-06|  男|
|         2|        1|   70|        2|   60|          钱电|1990-12-21|  男|
+----------+---------+-----+---------+-----+------------+----------+---+

(2)查询"01"课程比"02"课程成绩低的学生的信息及课程分数

//          (2)查询"01"课程比"02"课程成绩低的学生的信息及课程分数:/* scoreDF.as("s1").join(scoreDF.as("s2"),"student_id").filter("s1.course_id=1 and s2.course_id=2 and s1.score<s2.score ").join(studentDF,"student_id").show()*/+----------+---------+-----+---------+-----+------------+----------+---+
|student_id|course_id|score|course_id|score|student_name|     birth|sex|
+----------+---------+-----+---------+-----+------------+----------+---+
|         1|        1|   80|        2|   90|          赵雷|1990-01-01|  男|
|         5|        1|   76|        2|   87|          周梅|1991-12-01|  女|
+----------+---------+-----+---------+-----+------------+----------+---+

(3)查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

//          (3)查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩:scoreDF.groupBy("student_id").avg("score").filter($"avg(score)">=60).join(studentDF,"student_id").show()+----------+-----------------+------------+----------+---+
|student_id|       avg(score)|student_name|     birth|sex|
+----------+-----------------+------------+----------+---+
|         1|89.66666666666667|          赵雷|1990-01-01|  男|
|         3|             80.0|          孙风|1990-05-20|  男|
|         5|             81.5|          周梅|1991-12-01|  女|
|         7|             93.5|          郑竹|1989-07-01|  女|
|         2|             70.0|          钱电|1990-12-21|  男|
+----------+-----------------+------------+----------+---+*/

(4)查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

//        (4)查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩:– (包括有成绩的和无成绩的)studentDF.as("s1").join(( scoreDF.groupBy("student_id").avg("score")).as("s2"),Seq("student_id"),"left_outer").withColumnRenamed("avg(score)","A").where($"A"<60|| ($"A" isNull)).show()+----------+------------+----------+---+------------------+
|student_id|student_name|     birth|sex|                 A|
+----------+------------+----------+---+------------------+
|         6|          吴兰|1992-03-01|  女|              32.5|
|         4|          李云|1990-08-06|  男|33.333333333333336|
|         8|          王菊|1990-01-20|  女|              null|
+----------+------------+----------+---+------------------+

(5)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

//        (5)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩://选课数val df1: DataFrame = scoreDF.groupBy("student_id").count()//总成绩val df2: DataFrame = scoreDF.groupBy("student_id").sum("score")//连表studentDF.join(df1,Seq("student_id"),"left_outer").join(df2,Seq("student_id"),"left_outer").sort("student_id").show()+----------+------------+----------+---+-----+----------+
|student_id|student_name|     birth|sex|count|sum(score)|
+----------+------------+----------+---+-----+----------+
|         1|          赵雷|1990-01-01|  男|    3|       269|
|         2|          钱电|1990-12-21|  男|    3|       210|
|         3|          孙风|1990-05-20|  男|    3|       240|
|         4|          李云|1990-08-06|  男|    3|       100|
|         5|          周梅|1991-12-01|  女|    2|       163|
|         6|          吴兰|1992-03-01|  女|    2|        65|
|         7|          郑竹|1989-07-01|  女|    2|       187|
|         8|          王菊|1990-01-20|  女| null|      null|
+----------+------------+----------+---+-----+----------+

(6)查询"李"姓老师的数量

//          (6)查询"李"姓老师的数量:val l: Long = teacherDF.filter("teacher_name like '李%' ").count()println(l)1

(7)查询学过"张三"老师授课的同学的信息

//          (7)查询学过"张三"老师授课的同学的信息:.//先查张三老师授课的idteacherDF.filter("teacher_name ='张三' ").join(courseDF,"teacher_id")//查学生idscoreDF.join(teacherDF.filter("teacher_name ='张三' ").join(courseDF,"teacher_id"),"course_id").join(studentDF,"student_id").show()+----------+---------+--

使用idea练习Spark SQL经典练习50题相关推荐

  1. 四小时测试你的Sql能力--- MySQL经典练习50题

    1 简介 Sql能力是开发人员的业务能力之根,平常习惯了CRUD,可不要忘了回归根本哦! 2 初始环境 2.1 表结构 –1.学生表 Student(s_id,s_name,s_birth,s_sex ...

  2. sql语句练习50题(Mysql版-详加注释)

    表名和字段 1.学生表       Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别 2.课程表       Course(c_id, ...

  3. JAVA经典算法50题(转)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1]   题目:古典问题:有一对兔子, ...

  4. java经典50题_JAVA经典算法50题(3)【面试+工作】

    原标题:JAVA经典算法50题(3)[面试+工作] JAVA经典算法50题(3)[面试+工作] [程序21] 题目:求1+2!+3!+...+20!的和. 1.程序分析:此程序只是把累加变成了累乘. ...

  5. mysql求女生人数_Mysql版sql语句练习50题(小结)

    写完后一年没有看过,没想到这篇文章有这么多人点击.博主工作到一半去考研了,目前已上岸某中部985,也算是比较幸运.非常感谢大家在评论里的留言,留言太多不能一一回复,希望大家见谅.这两天根据评论把文章中 ...

  6. 数据分析sql面试必会6题经典_数据分析师SQL面试必备50题

    以下是SQL面试必备的经典的50道题目,每道题都有博主本人的解题思路和对应的SQL语句. 每道题的思路与答案均为博主本人主观理解,仅供参考. 环境:MySQL8.0 可视化工具:Navicat 1.查 ...

  7. sql统计各科成绩大于平均分的人_数据分析师SQL面试必备50题

    以下是SQL面试必备的经典的50道题目,每道题都有博主本人的解题思路和对应的SQL语句. 每道题的思路与答案均为博主本人主观理解,仅供参考. 环境:MySQL8.0 可视化工具:Navicat 1.查 ...

  8. MySQL经典练习题及答案,常用SQL语句练习50题,题目转自别人, 答案自己做的

    题目转自我疯–他也是转的, 但是答案是自己做的(有的结合了他的思路),尊重版权,特此说明.大家对我的SQL的有错误或者可以优化敬请留言,我一定虚心去改. 准备语句 – 创建mysql练习题库 crea ...

  9. mysql练习题及答案_MySQL经典练习题及答案,常用SQL语句练习50题

    #--插入学生表测试数据 #('01' , '赵雷' , '1990-01-01' , '男') insert into Student values('01' , '赵雷' , '1990-01-0 ...

  10. mysql sql语句面试经典50题_SQL:经典面试50题

    查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 1.1 查询同时存在" 01 "课程和" 02 "课 ...

最新文章

  1. gorm软删除_gorm踩坑:软删除与某个字段的唯一性
  2. matlab把每次循环的结果保存idx,来自Matlab的循环Python
  3. matplotlib 笔记 imshow
  4. 图神经网络代码_第一篇:图神经网络(GNN)计算框架绪论
  5. php 链接redis 实际例子
  6. 杭电ACM_1016_素数环
  7. mysql多条件查询_excel用字典处理多条件查询问题
  8. 第十八届浙大城市学院程序设计竞赛(同步赛)签到题ABDFGJL
  9. “从0开始的FreeRTOS”系列教程第一讲
  10. 【qt+opencv】实现人脸识别打卡系统2.0
  11. BUUCTF[强网杯 2019]随便注 的三种解法
  12. 荧光量子产率计算机模拟,如何提高荧光染料的量子产率,或许可以从这里找到答案...
  13. 11岁的Tumblr:开启艰难禁黄之路
  14. 【fpga里Verilog语言的小知识点】
  15. STM32实现自定义HID复合设备
  16. 数据类型、字符编码、文件处理
  17. 腾讯云轻量级服务器怎么搭建网站,腾讯云轻量应用服务器新手教程:快速搭建网站...
  18. 中科创达软件测试校招面试题 一面(技术)+二面(hr)
  19. 命令行 | 登录校园网 | curl
  20. IDEA使用中directory和package

热门文章

  1. MySQL redo log和undo log
  2. Python中if语句用法及其实例【详细】
  3. sas-arima时间序列(打败自己是自己)
  4. Sentinel基本概述和控制台的集成(重要)
  5. 蜀南竹海感受大片中的美景
  6. 金九银十正确打开方式!这些年我所经历的所有面试,工作感悟
  7. AES200设备AI Samples 测试文档
  8. 爬虫实战系列(九):知乎热榜全爬取及词云制作
  9. 微信公众号开发之(19)导入数据库
  10. NoSuchFieldError: DEFAULT_INCOMPATIBLE_IMPROVEMENTS