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

如何用PySpark匹配学生ID和姓名替换DataFrame的college列?

PySpark实现:匹配双字段后替换指定列

要实现当student_ID和student_NAME同时匹配时,用df1的college替换df2对应列的需求,最直接的方式是通过关联查询+字段选择完成,以下是具体实现步骤:

解决方案代码

import pyspark
from pyspark.sql import SparkSession
from pyspark.sql.functions import coalesce

spark = SparkSession.builder.appName('sparkdf').getOrCreate()

# 初始化df1和df2(代码同问题中给定内容)
data = [["1", "Amit", "DU"], ["2", "Mohit", "DU"], ["3", "rohith", "BHU"], ["4", "sridevi", "LPU"], ["1", "sravan", "KLMP"], ["5", "gnanesh", "IIT"]]
columns = ['student_ID', 'student_NAME', 'college']
df1 = spark.createDataFrame(data, columns)

data2 = [["1", "Amit", "jewf"], ["4", "sridevi", "wfv"], ["2", "Mohit", "efgew"], ["3", "rohith", "vwefv"], ["1", "sravan", "KLMP"], ["5", "gnanesh", "wfvw"]]
columns2 = ['student_ID', 'student_NAME', 'college']
df2 = spark.createDataFrame(data2, columns2)

# 1. 重命名df1的college列,避免关联后列名冲突
df1_ref = df1.withColumnRenamed("college", "target_college")

# 2. 以student_ID和student_NAME为关联键,左连接df2与df1_ref
# 若只需保留能匹配到的行,将how参数改为"inner"即可
joined_df = df2.join(df1_ref, on=["student_ID", "student_NAME"], how="left")

# 3. 替换college列:优先取df1的target_college,无匹配则保留df2原college
result_df = joined_df.select(
    "student_ID",
    "student_NAME",
    coalesce("target_college", "college").alias("college")
)

# 查看结果
result_df.show()

代码说明

  • 重命名列:将df1的college重命名为target_college,避免关联后两个表的college列名冲突,方便后续字段选择。
  • 关联方式选择:
    • 使用left连接会保留df2的所有行,即使某行在df1中没有匹配项;
    • 若只需要保留能在df1中匹配到的行,将how参数改为inner即可(对应你给出的预期输出行数)。
  • coalesce函数:按顺序取第一个非空值,这里实现了"匹配到则用df1的college,否则保留df2原数据"的逻辑。

对应预期输出的调整

如果需要完全匹配你给出的预期输出(仅保留5行),推测是需要过滤掉重复匹配项或存在笔误,可在结果后添加去重逻辑:

# 按student_ID和student_NAME去重
result_df = result_df.dropDuplicates(["student_ID", "student_NAME"])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:35:20