任務1:HDFS上有三份文件,分別為student.txt(學生信息表)result_bigdata.txt(大數據基礎成績表), result_math.txt(數學成績表)。
加載student.txt為名稱為student的RDDx數據,result_bigdata.txt為名稱為bigdata的RDD數據,result_math.txt 為名稱為math的RDD數據。
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -put /data/result_math.txt /user/root/
hdfs dfs -put /data/result_bigdata.txt /user/root/
hdfs dfs -put /data/student.txt /user/root/
val student= sc.textFile("/user/root/student.txt")
val bigdata = sc.textFile("/user/root/result_bigdata.txt")
val math= sc.textFile("/user/root/result_math.txt")
任務2:根據任務1得到的RDD bigdata及math,取出成績排名前5的學生成績信息。
val bigdata_map=bigdata.map(x=>x.split("\t")).map(x=>(x(0),x(1),x(2).toInt))
val bigdata_sort=bigdata_map.sortBy(x=>x._3,false)
bigdata_sort.take(5)
val math_map=math.map(x=>x.split("\t")).map(x=>(x(0),x(1),x(2).toInt))
val math_sort=math_map.sortBy(x=>x._3,false)
math_sort.take(5)
任務3:
- 找出考試成績得過100分的學生ID,最終的結果需要集合到一個RDD中。
val math_100= math.map(x=>x.split("\t")).map(x=>(x(0),x(2).toInt)).filter(x=>x._2==100)
math_100.collect
val bigdata_100= bigdata.map(x=>x.split("\t")).map(x=>(x(0),x(2).toInt)).filter(x=>x._2==100)
bigdata_100.collect
math_100.union(bigdata_100).distinct.collect()
2.找出兩門成績都得100分的學生ID,結果匯總為一個RDD。
math_100.intersection(bigdata_100).collect()
任務4:
- 輸出每位學生的總成績,要求將兩個成績表中學生ID相同的成績相加。
val math_kv= math.map(x=>x.split("\t")).map(x=>(x(0),x(2).toInt))
val bigdata_kv=math.map(x=>x.split("\t")).map(x=>(x(0),x(2).toInt))
val scores_kv=bigdata_kv.union(math_kv)
scores_kv.collect()
val allscore=scores_kv.reduceByKey((x,y)=>x+y)
allscore.collect()
2.輸出每位學生的平均成績,要求將兩個成績表中學生ID相同的成績相加并計算出平均分。
val scores_kv_count=scores_kv.mapValues(x=>(x,1))
scores_kv_count.collect()
Val?avgscore_count= scores_kv_count.reduceByKey((x,y)=>(x._1+y._1,x._2+y._2))
avgscore_count.collect()
val avgscore=avgscore_count.mapValues(x=>x._1/x._2)
avgscore.collect()
3.合并每個學生的總成績和平均成績。
val Total_score=allscore.join(avgscore)
Total_score.collect()
任務5:匯總學生成績并以文本格式存儲在HDFS上,數據匯總為學生ID,姓名,總分,平均分。
val studentInfo = m_student.join(avgscore).join(allscore)
studentInfo.saveAsTextFile("/user/root/total score")