在PySpark(Databricks)中实现两表左外连接并拼接列的技术问询
PySpark (Databricks) 实现左外连接并生成拼接字段的解决方案
针对你需要将两张表基于id和source字段匹配做左外连接,同时把code1和code2拼接成新字段的需求,我整理了一套在Databricks环境下可用的PySpark方案,步骤清晰且贴合你的数据场景:
1. 准备环境与创建示例DataFrame
首先我们先根据你提供的源表数据创建对应的DataFrame,方便后续测试:
from pyspark.sql import SparkSession from pyspark.sql.functions import concat_ws # 初始化SparkSession(Databricks环境下通常已自动初始化,这步可省略) spark = SparkSession.builder.appName("LeftJoinWithConcat").getOrCreate() # 创建Table1的DataFrame data_table1 = [ ("eu2", 10000162, "N4"), ("sus", 10000162, "M1"), ("pda", 10000162, "XM") ] schema_table1 = ["source", "id", "type"] table1 = spark.createDataFrame(data_table1, schema_table1) # 创建Table2的DataFrame data_table2 = [ ("eu2", 10000162, "CDNG_GRP", "PROB_CD"), ("sus", 10000162, "AANV", "NW"), ("pda", 10000162, "PM2", "VLPD") ] schema_table2 = ["source", "id", "code1", "code2"] table2 = spark.createDataFrame(data_table2, schema_table2)
2. 执行左外连接并生成拼接字段
这里我们使用别名来区分两张表的同名字段(source和id),避免字段冲突,同时通过concat_ws函数将code1和code2用-拼接成concat字段:
# 为两张表设置别名,方便引用 t1 = table1.alias("t1") t2 = table2.alias("t2") # 执行左外连接,指定连接条件 result_df = t1.join( t2, (t1.id == t2.id) & (t1.source == t2.source), how="left" ).select( t1.source, t1.id, t1.type, concat_ws("-", t2.code1, t2.code2).alias("concat") )
3. 查看结果
在Databricks环境下,你可以用display()函数获得更美观的可视化结果,或者用show()打印输出:
# Databricks推荐使用display display(result_df) # 或者用show() result_df.show(truncate=False)
执行后得到的结果完全符合你的期望输出:
+------+--------+----+-----------------+ |source|id |type|concat | +------+--------+----+-----------------+ |eu2 |10000162|N4 |CDNG_GRP-PROB_CD | |sus |10000162|M1 |AANV-NW | |pda |10000162|XM |PM2-VLPD | +------+--------+----+-----------------+
补充说明
- 使用
concat_ws而不是concat的原因是:concat_ws可以指定分隔符,并且如果其中某个字段为null时,仍能正常输出非空字段的内容(左外连接场景下可能出现这种情况)。 - 左外连接(
how="left")会保留table1中的所有数据,即使table2中没有匹配的记录(此时concat字段会为null),完全符合你的需求。
内容的提问来源于stack exchange,提问作者pavithra
相关产品推荐
相关产品推荐

