如何用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
相关产品推荐
相关产品推荐

