数据:
班级ID 姓名 年龄 性别 科目 成绩
12 张三 25 男 chinese 50
12 张三 25 男 math 60
12 张三 25 男 english 70
12 李四 20 男 chinese 50
12 李四 20 男 math 50
12 李四 20 男 english 50
12 王芳 19 女 chinese 70
12 王芳 19 女 math 70
12 王芳 19 女 english 70
13 张大三 25 男 chinese 60
13 张大三 25 男 math 60
13 张大三 25 男 english 70
13 李大四 20 男 chinese 50
13 李大四 20 男 math 60
13 李大四 20 男 english 50
13 王小芳 19 女 chinese 70
13 王小芳 19 女 math 80
13 王小芳 19 女 english 70
要求:
需求如下:
1.一共有多少人参加考试?
2.一共有多少个小于20岁的人参加考试?
3.一共有多少个等于20岁的人参加考试?
4.一共有多少个大于20岁的人参加考试?
===========================================
1.一共有多个男生参加考试?
2.一共有多少个女生参加考试?
3.12班有多少人参加考试?
4.13班有多少人参加考试?
===========================================
1.语文科目的平均成绩是多少?
2.数学科目的平均成绩是多少?
3.英语科目的平均成绩是多少?
===========================================
1.单个人平均成绩是多少?
===========================================
1.12班平均成绩是多少?
2.12班男生平均总成绩是多少?
3.12班女生平均总成绩是多少?
===========================================
1.全校语文成绩最高分是多少?
2.12班语文成绩最低分是多少?
3.13班数学最高成绩是多少?
===========================================
4.总成绩大于150分的12班的女生有几个?
package com.web.homework
import org.apache.spark.{SparkConf, SparkContext}
object HomeWork2 {
case class ScoreTable(classId: Int, name: String, age: Int, sex: String, course: String, score: Double)
def main(args: Array[String]): Unit = {
/**
* 初始化RDD,并整理数据集
*/
val conf = new SparkConf().setMaster("local").setAppName("HomeWork")
val sc = new SparkContext(conf)
val filePath = "C:\\Users\\Administrator\\Desktop\\dataset.txt"
val input = sc.textFile(filePath)
val header = input.take(1)
val table = input.filter(!header.contains(_))
val file = table.map(line => {
val fields = line.split(" ")
val table = ScoreTable(fields(0).toInt, fields(1), fields(2).toInt, fields(3), fields(4), fields(5).toDouble)
table
}).cache()
file.foreach(println)
/**
* 1.一共有多少人参加考试?
* 2.一共有多少个小于20岁的人参加考试?
* 3.一共有多少个等于20岁的人参加考试?
* 4.一共有多少个大于20岁的人参加考试?
*/
val nums1 = file.map(_.name).distinct().count()
val nums2 = file.filter(_.age < 20).map(x => (x.name, x.age)).distinct().count()
val nums3 = file.filter(_.age == 20).map(x => (x.name, x.age)).distinct().count()
val nums4 = file.filter(_.age > 20).map(x => (x.name, x.age)).distinct().count()
println("一共有" + nums1 + "人参加考试")
println("一共有" + nums2 + "个小于20岁的人参加考试")
println("一共有" + nums3 + "个等于20岁的人参加考试")
println("一共有" + nums4 + "个大于20岁的人参加考试")
/**
* 1.一共有多个男生参加考试?
* 2.一共有多少个女生参加考试?
* 3.12班有多少人参加考试?
* 4.13班有多少人参加考试?
*/
val nums5 = file.filter(_.sex == "男").map(x => (x.name, x.sex)).distinct().count()
val nums6 = file.filter(_.sex == "女").map(x => (x.name, x.sex)).distinct().count()
val nums7 = file.filter(_.classId == 12).map(x => (x.name, x.sex)).distinct().count()
val nums8 = file.filter(_.classId == 13).map(x => (x.name, x.sex)).distinct().count()
println("一共有" + nums5 + "男生参加考试")
println("一共有" + nums6 + "女生参加考试")
println("12班有" + nums7 + "人参加考试")
println("13班有" + nums8 + "人参加考试")
/**
* 1.语文科目的平均成绩是多少?
* 2.数学科目的平均成绩是多少?
* 3.英语科目的平均成绩是多少?
*/
val nums9 = file.map(x => (x.course, (1, x.score)))
.reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
.map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
nums9.collect().foreach(x => {
x._1 match {
case "math" => println("数学的平均值为:" + x._2)
case "chinese" => println("数学的平均值为:" + x._2)
case "english" => println("数学的平均值为:" + x._2)
}
})
/**
* 1.单个人平均成绩是多少?
*/
val nums10 = file.map(x => (x.name, (1, x.score)))
.reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
.map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
nums10.collect().foreach(x => {
x._1 match {
case "张三" => println("张三的平均分为:" + x._2)
case "李四" => println("李四的平均分为:" + x._2)
case "王芳" => println("王芳的平均分为:" + x._2)
case "张大三" => println("张大三的平均分为:" + x._2)
case "李大四" => println("李大四的平均分为:" + x._2)
case "王小芳" => println("王小芳的平均分为:" + x._2)
}
})
/**
* 1.12班平均成绩是多少?
* 2.12班男生平均总成绩是多少?
* 3.12班女生平均总成绩是多少?
*/
val nums11 = file.filter(_.classId == 12).map(x => (x.sex, (1, x.score)))
.reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
.map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
val nums12 = file.filter(_.classId == 12).map(x => (x.classId, (1, x.score)))
.reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
.map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
nums12.collect().foreach(x => println("12班的平均成绩为:" + x._2))
nums11.collect().foreach(x => {
x._1 match {
case "男" => println("12班男生的平均成绩为:" + x._2)
case "女" => println("12办女生平均成绩为:" + x._2)
}
})
/**
* 1.全校语文成绩最高分是多少?
* 2.12班语文成绩最低分是多少?
* 3.13班数学最高成绩是多少?
*/
val nums13 = file.filter(_.course == "chinese").map(x => (x.course, x.score)).groupByKey().map(_._2.max)
val nums14 = file.filter(_.classId == 12).filter(_.course == "chinese")
.map(x => (x.course, x.score)).groupByKey().map(_._2.min)
val nums15 = file.filter(_.classId == 13).filter(_.course == "math")
.map(x => (x.course, x.score)).groupByKey().map(_._2.max)
nums13.collect().foreach(x => println("全校语文成绩最高分为:" + x))
nums14.collect().foreach(x => println("12班语文成绩最低分为:" + x))
nums15.collect().foreach(x => println("13班数学成绩最高分为:" + x))
/**
* 4.总成绩大于150分的12班的女生有几个?
*/
val nums16 = file.filter(_.classId == 12).filter(_.sex == "女").map(x => (x.name, x.score))
.reduceByKey(_ + _).filter(_._2 >= 150).count()
println("总成绩大于150分的12班的女生有:" + nums16 + "个")
sc.stop()
}
}