SparkCore對學生成績的統(tǒng)計案例
1需求分析:
根據(jù)數(shù)據(jù)文件對數(shù)據(jù)進行分析,完成如下功能:
(1)查詢學生成績表中的前5名;
(2)輸出單科成績?yōu)?00分的學生ID;
(3)輸出每位學生所有科目的總成績。
2數(shù)據(jù)源(bigdata.txt,math.txt,student.txt)
#bigdata.txt
1001 大數(shù)據(jù)基礎 90
1002 大數(shù)據(jù)基礎 94
1003 大數(shù)據(jù)基礎 100
1004 大數(shù)據(jù)基礎 99
1005 大數(shù)據(jù)基礎 90
1006 大數(shù)據(jù)基礎 94
1007 大數(shù)據(jù)基礎 100
1008 大數(shù)據(jù)基礎 93
1009 大數(shù)據(jù)基礎 89
1010 大數(shù)據(jù)基礎 78
1011 大數(shù)據(jù)基礎 91
1012 大數(shù)據(jù)基礎 84
#math.txt
1001 應用數(shù)學 96
1002 應用數(shù)學 94
1003 應用數(shù)學 100
1004 應用數(shù)學 100
1005 應用數(shù)學 94
1006 應用數(shù)學 80
1007 應用數(shù)學 90
1008 應用數(shù)學 94
1009 應用數(shù)學 84
1010 應用數(shù)學 86
1011 應用數(shù)學 79
1012 應用數(shù)學 91
#student.txt
1001 李正明
1002 王一磊
1003 陳志華
1004 張永麗
1005 趙信
1006 古明遠
1007 劉浩明
1008 沈彬
1009 李子琪
1010 王嘉棟
1011 柳夢文
1012 錢多多
3代碼實現(xiàn)
(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中傳入數(shù)據(jù)源,可以是相對路徑或者絕對路徑
val bigdata: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_bigdata.txt")
//獲取每個數(shù)據(jù)值
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()
}
}
結(jié)果為:
(2)輸出單科成績?yōu)?00分的學生ID;
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
//輸出單科成績?yōu)?00分的學生ID;目的是輸出學生ID,分數(shù)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)
//讀取大數(shù)據(jù)成績表
val bigdata: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_bigdata.txt")
//獲取每個數(shù)據(jù)值
val bigdataMap: RDD[(String, String, Int)] = bigdata.map(
x => {
var line = x.split("\t")
(line(0), line(1), line(2).toInt)
}
)
//讀取數(shù)學成績表
val math: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_math.txt")
//獲取每個數(shù)據(jù)值
val mathMap: RDD[(String, String, Int)] = math.map(
x => {
var line = x.split("\t")
(line(0), line(1), line(2).toInt)
}
)
//分別過濾出成績?yōu)?00分的學生
val bigdataFilter = bigdataMap.filter(x => x._3 == 100).map(_._1)
//打印一下大數(shù)據(jù)成績?yōu)?00的學生ID
bigdataFilter.collect().foreach(println)
//打印一下數(shù)學成績?yōu)?00的學生ID
val mathFilter = mathMap.filter(x => x._3 == 100).map(_._1)
mathFilter.collect().foreach(println)
//取出單科成績?yōu)?00的學生ID,只需要成績100的都拿出來,取出重復的(因為有人太厲害了,數(shù)學和大數(shù)據(jù)都是100分)
val res: RDD[String] = bigdataFilter.union(mathFilter).distinct()
res.collect().foreach(println)
}
}
結(jié)果為:
(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)
//讀取大數(shù)據(jù)成績表
val bigdata: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_bigdata.txt")
//獲取每個數(shù)據(jù)值
val bigdataMap: RDD[(String, Int)] = bigdata.map(
x => {
var line = x.split("\t")
(line(0), line(2).toInt)
}
)
//讀取數(shù)學成績表
val math: RDD[String] = sc.textFile("spark_core\\src\\main\\java\\data\\result_math.txt")
//獲取每個數(shù)據(jù)值
val mathMap: RDD[(String, Int)] = math.map(
x => {
var line = x.split("\t")
(line(0), line(2).toInt)
}
)
//reduceByKey相同key,即找到相同“student_ID”,去把他們對應的成績相加,reduce你就把它當成sum求多個數(shù)值的和即可
val res: RDD[(String, Int)] = bigdataMap.union(mathMap).reduceByKey(_ + _)
res.collect().foreach(println)
}
}
結(jié)果為:
文章來源:http://www.zghlxwxcb.cn/news/detail-419581.html
解題方法很多種,?可參考此博主的分析:https://blog.csdn.net/xiexianyou666/article/details/105766726
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-419581.html
到了這里,關(guān)于SparkCore對學生成績的統(tǒng)計案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!