Student计算
package com.shujia.spark.core import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object Demo17Student { def main(args: Array[String]): Unit = { /** * 4、统计偏科最严重的前100名学生 * 1、计算每个学生分数的方差 * 2、对方差排序,取前100 * 3、整理数据 * */ val conf: SparkConf = new SparkConf() .setAppName("student") .setMaster("local") val sc = new SparkContext(conf) //读取分数表 val scoresRDD: RDD[String] = sc.textFile("data/score.txt") val courceRDD: RDD[String] = sc.textFile("data/cource.txt") //由于分数的范围不一样,所有需要做归一化 val scoreKVRDD: RDD[(String, String)] = scoresRDD.map(sco => { (sco.split(",")(1), sco) }) val couKVRDD: RDD[(String, String)] = courceRDD.map(cou => { (cou.split(",")(0), cou) }) //关联学生表和分数表 val joinRDD: RDD[(String, (String, String))] = scoreKVRDD.join(couKVRDD) val idAndScoreRDD: RDD[(String, Double)] = joinRDD.map { //如果参数用不到可以通过下划线代替 case (_: String, (sco: String, cou: String)) => val scosplit: Array[String] = sco.split(",") //学号 val id: String = scosplit(0) val score: Double = scosplit(2).toDouble val couSumSco: Double = cou.split(",")(2).toDouble //对分数进行归一化 (id, score / couSumSco) } //按照id进行分组 val groupByRDD: RDD[(String, Iterable[Double])] = idAndScoreRDD.groupByKey() //计算每个学生标准差 val stdRDD: RDD[(String, Double)] = groupByRDD.map { case (id: String, ss: Iterable[Double]) => /** * 计算学生分数标准差 */ val scolist: List[Double] = ss.toList //计算平均数 val avgSco: Double = scolist.sum / scolist.size //分数减去平均数再平方 val chaScore: List[Double] = scolist.map(i => (i - avgSco) * (i - avgSco)) //标准差的分子 val fz: Double = chaScore.sum //计算标准差 val std: Double = fz / scolist.size (id, std) } stdRDD.foreach(println) //降序排序取前100 val top10List: Array[(String, Double)] = stdRDD.sortBy(_._2,ascending = false).take(100) //偏科最严重学生的id val ids: Array[String] = top10List.map(_._1) //取出学生的分数 val top100Score: RDD[String] = scoresRDD.filter(score => { val id: String = score.split(",")(0) ids.contains(id) }) top100Score.foreach(println) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能