Scala用RDD求学生平均成绩
时间: 2023-11-01 08:07:39 浏览: 229
假设我们有一个学生成绩的RDD,其中每个元素都是`(学生ID, 成绩)`的二元组,可以使用以下代码来求学生平均成绩:
```scala
val scores: RDD[(String, Double)] = ... // (学生ID, 成绩) 的二元组RDD
val avgScores: RDD[(String, Double)] = scores
.groupByKey() // 按学生ID分组
.mapValues(scores => scores.sum / scores.size) // 计算平均成绩
avgScores.foreach(println) // 输出结果
```
首先,使用 `groupByKey()` 按学生ID将成绩分组,然后使用 `mapValues()` 对每个分组计算平均成绩。最终得到一个 `(学生ID, 平均成绩)` 的二元组RDD。
相关问题
正确读取学生成绩数据,创建对应的RDD,利用RDD相关算子,求解学生的平均成绩,以及没门课程的平均成绩。
假设我们有一个学生成绩数据文件 `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()` 计算平均成绩。
正确读取学生成绩数据,创建对应的RDD,利用RDD相关算子,求解学生的平均成绩,以及没门课程的平均成绩。(40%)
假设我们有一个学生成绩数据文件 `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` 方法获取每个成绩的索引。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)