PySpark如何基于文本数据计算学生平均分并转为DataFrame
用PySpark基于RDD计算学生平均分并转DataFrame实现方案
处理步骤
你的数据中包含--分隔行,需先过滤无效行,再按以下流程处理:
初始化Spark环境并读取数据
先创建SparkSession,再从文本文件加载数据生成初始RDD:from pyspark.sql import SparkSession # 初始化SparkSession spark = SparkSession.builder.appName("StudentAvgCalculation").getOrCreate() sc = spark.sparkContext # 读取目标文本文件,替换为你的文件路径 raw_rdd = sc.textFile("student_marks.txt")清理数据并转换格式
过滤掉--分隔行,将每行拆分为姓名和分数,并把分数转为整数类型:# 过滤无效分隔行 filtered_rdd = raw_rdd.filter(lambda line: line.strip() != "--") # 拆分数据并转换分数类型 student_mark_pairs = filtered_rdd.map(lambda line: (line.split()[0], int(line.split()[1])))基于RDD计算平均分
使用aggregateByKey高效统计每个学生的总分和考试次数,再计算平均分:# 聚合计算总分与次数,再求平均 avg_marks_rdd = student_mark_pairs.aggregateByKey( (0, 0), # 初始值:(总分, 次数) lambda acc, mark: (acc[0] + mark, acc[1] + 1), # 分区内聚合逻辑 lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1]) # 分区间聚合逻辑 ).mapValues(lambda x: x[0] / x[1])转换为DataFrame并输出
将RDD转换为指定列名的DataFrame,可按需格式化小数位数:# 转换为DataFrame result_df = avg_marks_rdd.toDF(["FirstName", "AvgMarks"]) # 格式化并展示结果(保留1位小数) result_df.select( "FirstName", result_df["AvgMarks"].cast("decimal(10,1)").alias("AvgMarks") ).show()
正确计算结果示例
基于你提供的原始数据,实际计算出的平均分如下:
| FirstName | AvgMarks |
|---|---|
| robert | 49.0 |
| daniel | 76.5 |
| andrew | 49.5 |
| jake | 33.5 |
| peter | 33.5 |
| sophia | 61.5 |
| marie | 77.5 |
你给出的示例结果可能存在输入误差,以上为基于原始数据的准确计算值。
内容的提问来源于stack exchange,提问作者Karthik Bhandary
相关产品推荐
相关产品推荐

