正确读取学生成绩数据,创建对应的RDD,利用RDD相关算子,求解学生的平均成绩,以及没门课程的平均成绩。(40%)
时间: 2024-03-12 16:50:00 浏览: 462
假设我们有一个学生成绩数据文件 `scores.txt`,文件中的每一行包含多个字段,其中第一个字段是学生ID,第二个字段是学生姓名,后面的字段是各门课程的成绩。例如:
```
1001,Tom,70,85,80
1001,Cat,85,90,70
```
可以使用以下代码读取文件并计算学生和课程的平均成绩:
```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 studentName = fields(1)
val courseScores = fields.drop(2).map(_.toDouble)
(studentId, (studentName, courseScores)) // 构建二元组 (学生ID, (学生姓名, 成绩列表))
})
// 计算学生平均成绩
val avgScoresByStudent = scores
.mapValues { case (name, scores) => (scores.sum / scores.length) } // 计算平均成绩
avgScoresByStudent.foreach(println) // 输出每个学生的平均成绩
// 计算每门课程的平均成绩
val courseScores = scores
.flatMapValues { case (name, scores) => scores.zipWithIndex.map { case (score, index) => (index, score) } } // 将每个成绩映射为 (课程索引, 成绩) 的二元组
.groupByKey() // 按课程索引分组
.mapValues(scores => scores.sum / scores.size) // 计算平均成绩
courseScores.foreach(println) // 输出每门课程的平均成绩
```
首先,使用 `textFile()` 方法读取文件,并将每一行映射为一个二元组 `学生ID -> (学生姓名, 成绩列表)`。然后,分别对学生和课程进行平均成绩计算。
计算学生平均成绩时,使用 `mapValues()` 对每个学生的成绩列表求平均值。
计算课程平均成绩时,先将每个成绩映射为 `(课程索引, 成绩)` 的二元组,然后使用 `groupByKey()` 按课程索引分组,最后使用 `mapValues()` 计算平均成绩。注意,在将每个成绩映射为 `(课程索引, 成绩)` 的二元组时,可以使用 `zipWithIndex` 方法获取每个成绩的索引。
阅读全文