5 已知scoredatatxt文件中存放的是某学院某学期开设课程的学生成绩字段是姓名、课程名、成绩。共10分 要求:用Spark RDD编程实现以下功能需要贴完整代码和程序运行的结果并给出关键代码的注释。3 输出学院每门课的名字和平均分保留两位小数4 按学生姓名排序输出每个学生的选课和成绩情况5 输出本学期的平均成绩前10的学生与平均分保留两位小数
首先,我们需要读取scoredata.txt文件,并将其转换为RDD格式的数据。然后,我们可以使用Spark RDD编程来实现所需的功能。
以下是实现上述要求的完整代码:
from pyspark import SparkContext, SparkConf
# 创建SparkConf和SparkContext
conf = SparkConf().setAppName("ScoreAnalysis")
sc = SparkContext(conf=conf)
# 读取scoredata.txt文件,并转换为RDD格式的数据
lines = sc.textFile("scoredata.txt")
data = lines.map(lambda line: line.split("\t"))
# 3) 输出学院每门课的名字和平均分(保留两位小数)
course_avg_scores = data.map(lambda x: (x[1], float(x[2]))) \
.groupByKey() \
.mapValues(lambda x: round(sum(x) / len(x), 2))
course_avg_scores.collect()
# 4) 按学生姓名排序输出每个学生的选课和成绩情况
student_scores = data.map(lambda x: (x[0], (x[1], float(x[2])))) \
.groupByKey() \
.mapValues(list) \
.sortByKey()
student_scores.collect()
# 5) 输出本学期的平均成绩前10的学生与平均分(保留两位小数)
student_avg_scores = data.map(lambda x: (x[0], float(x[2]))) \
.groupByKey() \
.mapValues(lambda x: round(sum(x) / len(x), 2)) \
.sortBy(lambda x: x[1], False)
top_10_students = student_avg_scores.take(10)
top_10_students
在上述代码中,我们首先读取scoredata.txt文件,并使用map函数将每一行数据分割成姓名、课程名和成绩。然后,我们可以使用不同的RDD操作来实现每一个功能要求。
对于第3个要求,我们使用map函数将课程名和成绩提取出来,并使用groupByKey函数将相同课程名的成绩进行分组。然后,我们使用mapValues函数计算每门课程的平均分,并使用round函数保留两位小数。最后,使用collect函数将结果返回到Driver程序并打印出来。
对于第4个要求,我们使用map函数将学生姓名、课程名和成绩提取出来,并使用groupByKey函数将相同学生的课程名和成绩进行分组。然后,使用mapValues函数将分组后的数据转换为列表形式,并使用sortByKey函数按学生姓名进行排序。最后,使用collect函数将结果返回到Driver程序并打印出来。
对于第5个要求,我们使用map函数将学生姓名和成绩提取出来,并使用groupByKey函数将相同学生的成绩进行分组。然后,使用mapValues函数计算每个学生的平均成绩,并使用round函数保留两位小数。接下来,我们使用sortBy函数按平均成绩进行降序排序,并使用take函数取前10个学生的数据。最后,将结果打印出来。
请注意,上述代码中的文件路径应根据实际情况进行修改。
希望以上内容对您有所帮助
原文地址: https://www.cveoy.top/t/topic/h5SI 著作权归作者所有。请勿转载和采集!