SparkCore对学生成绩的统计案例
1需求分析:
根据数据文件对数据进行分析,完成如下功能:
(1)查询学生成绩表中的前5名;
(2)输出单科成绩为100分的学生ID;
(3)输出每位学生所有科目的总成绩。
2数据源(bigdata.txt,math.txt,student.txt)
#bigdata.txt
1001 大数据基础 90
1002 大数据基础 94
1003 大数据基础 100
1004 大数据基础 99
1005 大数据基础 90
1006 大数据基础 94
1007 大数据基础 100
1008 大数据基础 93
1009 大数据基础 89
1010 大数据基础 78
1011 大数据基础 91
1012 大数据基础 84
#math.txt
1001 应用数学 96
1002 应用数学 94
1003 应用数学 100
1004 应用数学 100
1005 应用数学 94
1006 应用数学 80
1007 应用数学 90
1008 应用数学 94
1009 应用数学 84
1010 应用数学 86
1011 应用数学 79
1012 应用数学 91
#student.txt
1001 李正明
1002 王一磊
1003 陈志华
1004 张永丽
1005 赵信
1006 古明远
1007 刘浩明
1008 沈彬
1009 李子琪
1010 王嘉栋
1011 柳梦文
1012 钱多多
3代码实现
(1)查询学生成绩表中的前5名;这里指的是单科成绩哈,所以就没有合并math和data,分开求的各自排名
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
//我们的目的是取出学生成绩表中的前五名
object Top5_student_grade {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local").setAppName("grade")
val sc = new SparkContext(sparkConf)
//textFile中传入数据源,可以是相对路径或者绝对路径
val bigdata: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_bigdata.txt")
//获取每个数据值
val bigdataMap: RDD[(String, String, String)] = bigdata.map(
x => {
var line = x.split("\t")
(line(0), line(1), line(2))
}
)
bigdataMap.sortBy(x=>x._3).take(5).foreach(println)
sc.stop()
}
}
结果为:
(2)输出单科成绩为100分的学生ID;
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
//输出单科成绩为100分的学生ID;目的是输出学生ID,分数100
object grade_100_studentId {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local").setAppName("grade_100")
val sc = new SparkContext(sparkConf)
//读取大数据成绩表
val bigdata: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_bigdata.txt")
//获取每个数据值
val bigdataMap: RDD[(String, String, Int)] = bigdata.map(
x => {
var line = x.split("\t")
(line(0), line(1), line(2).toInt)
}
)
//读取数学成绩表
val math: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_math.txt")
//获取每个数据值
val mathMap: RDD[(String, String, Int)] = math.map(
x => {
var line = x.split("\t")
(line(0), line(1), line(2).toInt)
}
)
//分别过滤出成绩为100分的学生
val bigdataFilter = bigdataMap.filter(x => x._3 == 100).map(_._1)
//打印一下大数据成绩为100的学生ID
bigdataFilter.collect().foreach(println)
//打印一下数学成绩为100的学生ID
val mathFilter = mathMap.filter(x => x._3 == 100).map(_._1)
mathFilter.collect().foreach(println)
//取出单科成绩为100的学生ID,只需要成绩100的都拿出来,取出重复的(因为有人太厉害了,数学和大数据都是100分)
val res: RDD[String] = bigdataFilter.union(mathFilter).distinct()
res.collect().foreach(println)
}
}
结果为:
(3)输出每位学生所有科目的总成绩。输出学生ID和总成绩
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
object student_totalGrade {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local").setAppName("grade_100")
val sc = new SparkContext(sparkConf)
//读取大数据成绩表
val bigdata: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_bigdata.txt")
//获取每个数据值
val bigdataMap: RDD[(String, Int)] = bigdata.map(
x => {
var line = x.split("\t")
(line(0), line(2).toInt)
}
)
//读取数学成绩表
val math: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_math.txt")
//获取每个数据值
val mathMap: RDD[(String, Int)] = math.map(
x => {
var line = x.split("\t")
(line(0), line(2).toInt)
}
)
//reduceByKey相同key,即找到相同“student_ID”,去把他们对应的成绩相加,reduce你就把它当成sum求多个数值的和即可
val res: RDD[(String, Int)] = bigdataMap.union(mathMap).reduceByKey(_ + _)
res.collect().foreach(println)
}
}
结果为:
文章来源:https://www.toymoban.com/news/detail-419581.html
解题方法很多种,✌可参考此博主的分析:https://blog.csdn.net/xiexianyou666/article/details/105766726
👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍❤❤❤👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍❤❤❤👍👍👍👍👍👍👍👍👍👍👍👍👍👍文章来源地址https://www.toymoban.com/news/detail-419581.html
到了这里,关于SparkCore对学生成绩的统计案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!