正确读取学生成绩数据,创建对应的RDD,利用RDD相关算子,求解学生的平均成绩,以及没门课程的平均成绩。
时间: 2024-03-12 08:49:55 浏览: 45
假设我们有一个学生成绩数据文件 `scores.txt`,文件中每一行包含三个字段:生ID、课程名称、成绩,用逗号分隔。例如:
```
1001,Math,80
1002,Math,90
1001,English,75
1002,English,85
```
可以使用以下代码读取文件并计算学生和课程的平均成绩:
```scala
import org.apache.spark.{SparkConf, SparkContext}
val conf = new SparkConf().setAppName("AverageScore").setMaster("local")
val sc = new SparkContext(conf)
// 读取学生成绩数据文件
val scores = sc.textFile("scores.txt")
.map(line => {
val fields = line.split(",")
val studentId = fields(0)
val course = fields(1)
val score = fields(2).toDouble
((studentId, course), score) // 构建二元组 ((学生ID, 课程名称), 成绩)
})
// 计算学生平均成绩
val avgScoresByStudent = scores
.mapValues(score => (score, 1)) // 将每个成绩映射为 (成绩,1) 的二元组
.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2)) // 按学生ID和课程名称合并成绩和计数
.mapValues { case (sum, count) => sum / count } // 计算平均成绩
avgScoresByStudent.foreach(println) // 输出每个学生的平均成绩
// 计算每门课程的平均成绩
val avgScoresByCourse = scores
.mapValues(score => (score, 1)) // 将每个成绩映射为 (成绩,1) 的二元组
.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2)) // 按课程名称合并成绩和计数
.mapValues { case (sum, count) => sum / count } // 计算平均成绩
avgScoresByCourse.foreach(println) // 输出每门课程的平均成绩
```
首先,使用 `textFile()` 方法读取文件,并将每一行映射为一个二元组 `(学生ID, 课程名称) -> 成绩`。然后,分别对学生和课程进行平均成绩计算。
计算学生平均成绩时,先将每个成绩映射为 `(成绩, 1)` 的二元组,然后使用 `reduceByKey()` 按学生ID和课程名称合并成绩和计数,最后使用 `mapValues()` 计算平均成绩。
计算课程平均成绩时,也是先将每个成绩映射为 `(成绩, 1)` 的二元组,然后使用 `reduceByKey()` 按课程名称合并成绩和计数,最后使用 `mapValues()` 计算平均成绩。
阅读全文