基本需求
用spark求出每个院系每个班每个专业前3名。
样本数据
数据格式:id,studentId,language,math,english,classId,departmentId,即id,学号,语文,数学,外语,班级,院系
1,111,68,69,90,1班,经济系
2,112,73,80,96,1班,经济系
3,113,90,74,75,1班,经济系
4,114,89,94,93,1班,经济系
5,115,99,93,89,1班,经济系
6,121,96,74,79,2班,经济系
7,122,89,86,85,2班,经济系
8,123,70,78,61,2班,经济系
9,124,76,70,76,2班,经济系
10,211,89,93,60,1班,外语系
11,212,76,83,75,1班,外语系
12,213,71,94,90,1班,外语系
13,214,94,94,66,1班,外语系
14,215,84,82,73,1班,外语系
15,216,85,74,93,1班,外语系
16,221,77,99,61,2班,外语系
17,222,80,78,96,2班,外语系
18,223,79,74,96,2班,外语系
19,224,75,80,78,2班,外语系
20,225,82,85,63,2班,外语系
用Spark core实现
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}
/**
*学生成绩 TopK问题
*
* 每个院系每个班每科前3名
* 每行数据格式:id,studentId,language,math,english,classId,departmentId
*/
object TestGroupBy {
def main(args: Array[String]): Unit = {
/**设置日志等级*/
Logger.getLogger("org").setLevel(Level.WARN)
/**设置spark环境*/
val conf=new SparkConf().setAppName("TestGroupBy").setMaster("local[4]")
val sc=new SparkContext(conf)
/**原始数据解析*/
val studentsScore = sc.textFile("/Users/wangpei/Desktop/scores2.txt").map(_.split(","))
val groups=studentsScore.map(scoreInfo=>(scoreInfo(1),scoreInfo(2).toInt,scoreInfo(3).toInt,scoreInfo(4).toInt,scoreInfo(5),scoreInfo(6)))
/**多次分组取TopK*/
val topK=groups.groupBy(item=>(item._6,item._5)).map(subG=>{
val (departmentId,classId) = subG._1
val languageTopK=subG._2.toList.sortBy(_._2)(Ordering.Int.reverse).take(3).map(item=>item._2+"分:学号"+item._1)
val mathTopK=subG._2.toList.sortBy(_._3)(Ordering.Int.reverse).take(3).map(item=>item._3+"分:学号"+item._1)
val englishTopK=subG._2.toList.sortBy(_._4)(Ordering.Int.reverse).take(3).map(item=>item._4+"分:学号"+item._1)
(departmentId,classId,Map("语文前3"->languageTopK,"数学前3"->mathTopK,"外语前3"->englishTopK))
})
/**结果显示*/
topK.foreach(println)
}
}