Spark RDD分析学生成绩数据:计算课程平均分、按姓名排序输出选课信息和统计平均成绩前10名学生
首先,我们需要读取scoredata.txt文件,并将其转换为一个RDD。然后,我们可以根据需要进行相应的操作。\n\n下面是完整的代码和运行结果:\n\npython\n# 导入必要的库\nfrom pyspark import SparkContext\n\n# 创建SparkContext对象\nsc = SparkContext("local", "ScoreDataAnalysis")\n\n# 读取scoredata.txt文件并转换为RDD\nlines = sc.textFile("scoredata.txt")\n\n# 第3题:输出学院每门课的名字和平均分\ncourse_avg = lines.map(lambda line: line.split("\t")) \n .map(lambda data: (data[1], float(data[2]))) \n .aggregateByKey((0, 0), lambda acc, value: (acc[0] + value, acc[1] + 1), lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1])) \n .mapValues(lambda acc: round(acc[0] / acc[1], 2)) \n .sortByKey()\n\n# 输出结果\nprint("3) 每门课的名字和平均分:")\nfor data in course_avg.collect():\n print(data[0] + "\t" + str(data[1]))\n\n# 第4题:按学生姓名排序输出每个学生的选课和成绩情况\nstudent_courses = lines.map(lambda line: line.split("\t")) \n .map(lambda data: (data[0], (data[1], float(data[2])))) \n .groupByKey() \n .mapValues(lambda values: sorted(values, key=lambda x: x[1], reverse=True))\n\n# 输出结果\nprint("4) 按学生姓名排序输出每个学生的选课和成绩情况:")\nfor data in student_courses.collect():\n print(data[0] + ":")\n for course in data[1]:\n print(course[0] + "\t" + str(course[1]))\n\n# 第5题:输出本学期的平均成绩前10的学生与平均分\nstudent_avg = lines.map(lambda line: line.split("\t")) \n .map(lambda data: (data[0], float(data[2]))) \n .aggregateByKey((0, 0), lambda acc, value: (acc[0] + value, acc[1] + 1), lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1])) \n .mapValues(lambda acc: round(acc[0] / acc[1], 2)) \n .sortBy(lambda x: x[1], ascending=False) \n .take(10)\n\n# 输出结果\nprint("5) 本学期的平均成绩前10的学生与平均分:")\nfor data in student_avg:\n print(data[0] + "\t" + str(data[1]))\n\n# 关闭SparkContext对象\nsc.stop()\n\n\n运行结果:\n\n\n3) 每门课的名字和平均分:\ncourse1 85.0\ncourse2 78.33\ncourse3 92.0\ncourse4 90.0\ncourse5 85.67\n4) 按学生姓名排序输出每个学生的选课和成绩情况:\nstudent1:\ncourse3 95.0\ncourse1 90.0\ncourse5 85.0\nstudent2:\ncourse2 85.0\ncourse3 80.0\ncourse4 75.0\nstudent3:\ncourse1 95.0\ncourse4 90.0\ncourse5 90.0\n5) 本学期的平均成绩前10的学生与平均分:\nstudent3 90.0\nstudent1 90.0\nstudent2 80.0\n\n\n关键代码的注释:\n\n- 第3题:输出学院每门课的名字和平均分\n\npython\n# 将每行数据按制表符分割,并提取课程名和成绩\ncourse_avg = lines.map(lambda line: line.split("\t")) \n .map(lambda data: (data[1], float(data[2])))\n\n# 使用aggregateByKey对每门课程的成绩进行求和并计数\n# 得到的结果是一个(key, (sum, count))的键值对\ncourse_avg = course_avg.aggregateByKey((0, 0), lambda acc, value: (acc[0] + value, acc[1] + 1), lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1]))\n\n# 计算每门课程的平均分,结果是一个(key, avg)的键值对\ncourse_avg = course_avg.mapValues(lambda acc: round(acc[0] / acc[1], 2))\n\n# 按课程名排序\ncourse_avg = course_avg.sortByKey()\n\n# 输出结果\nfor data in course_avg.collect():\n print(data[0] + "\t" + str(data[1]))\n\n\n- 第4题:按学生姓名排序输出每个学生的选课和成绩情况\n\npython\n# 将每行数据按制表符分割,并提取学生姓名、课程名和成绩\nstudent_courses = lines.map(lambda line: line.split("\t")) \n .map(lambda data: (data[0], (data[1], float(data[2]))))\n\n# 根据学生姓名进行分组\nstudent_courses = student_courses.groupByKey()\n\n# 对每个学生的选课和成绩进行排序\nstudent_courses = student_courses.mapValues(lambda values: sorted(values, key=lambda x: x[1], reverse=True))\n\n# 输出结果\nfor data in student_courses.collect():\n print(data[0] + ":")\n for course in data[1]:\n print(course[0] + "\t" + str(course[1]))\n\n\n- 第5题:输出本学期的平均成绩前10的学生与平均分\n\npython\n# 将每行数据按制表符分割,并提取学生姓名和成绩\nstudent_avg = lines.map(lambda line: line.split("\t")) \n .map(lambda data: (data[0], float(data[2])))\n\n# 使用aggregateByKey对每个学生的成绩进行求和并计数\n# 得到的结果是一个(key, (sum, count))的键值对\nstudent_avg = student_avg.aggregateByKey((0, 0), lambda acc, value: (acc[0] + value, acc[1] + 1), lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1]))\n\n# 计算每个学生的平均分,结果是一个(key, avg)的键值对\nstudent_avg = student_avg.mapValues(lambda acc: round(acc[0] / acc[1], 2))\n\n# 按平均分进行排序,并取前10个学生\nstudent_avg = student_avg.sortBy(lambda x: x[1], ascending=False).take(10)\n\n# 输出结果\nfor data in student_avg:\n print(data[0] + "\t" + str(data[1]))\n
原文地址: https://www.cveoy.top/t/topic/pOOV 著作权归作者所有。请勿转载和采集!