You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark如何基于文本数据计算学生平均分并转为DataFrame

用PySpark基于RDD计算学生平均分并转DataFrame实现方案

处理步骤

你的数据中包含--分隔行,需先过滤无效行,再按以下流程处理:

  1. 初始化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")
    
  2. 清理数据并转换格式
    过滤掉--分隔行,将每行拆分为姓名和分数,并把分数转为整数类型:

    # 过滤无效分隔行
    filtered_rdd = raw_rdd.filter(lambda line: line.strip() != "--")
    # 拆分数据并转换分数类型
    student_mark_pairs = filtered_rdd.map(lambda line: (line.split()[0], int(line.split()[1])))
    
  3. 基于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])
    
  4. 转换为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()
    

正确计算结果示例

基于你提供的原始数据,实际计算出的平均分如下:

FirstNameAvgMarks
robert49.0
daniel76.5
andrew49.5
jake33.5
peter33.5
sophia61.5
marie77.5

你给出的示例结果可能存在输入误差,以上为基于原始数据的准确计算值。

内容的提问来源于stack exchange,提问作者Karthik Bhandary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:32:38