Spark-小练试刀
任务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")