SparkCore对学生成绩的统计案例
1需求分析:
根据数据文件对数据进行分析,完成如下功能:
(1)查询学生成绩表中的前5名;
(2)输出单科成绩为100分的学生ID;
(3)输出每位学生所有科目的总成绩。
2数据源(bigdata.txt,math.txt,student.txt)
#bigdata.txt1001 大数据基础 901002 大数据基础 941003 大数据基础 1001004 大数据基础 991005 大数据基础 901006 大数据基础 941007 大数据基础 1001008 大数据基础 931009 大数据基础 891010 大数据基础 781011 大数据基础 911012 大数据基础 84
#math.txt1001 应用数学 961002 应用数学 941003 应用数学 1001004 应用数学 1001005 应用数学 941006 应用数学 801007 应用数学 901008 应用数学 941009 应用数学 841010 应用数学 861011 应用数学 791012 应用数学 91
#student.txt1001 李正明
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://blog.csdn.net/xiexianyou666/article/details/105766726
👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍❤❤❤👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍❤❤❤👍👍👍👍👍👍👍👍👍👍👍👍👍👍
版权归原作者 -berry 所有, 如有侵权,请联系我们删除。