Databricks中PySpark如何关联表取值,未匹配返回空值并保留全量数据
解决Databricks中DataFrame左连接保留全量数据的问题
需求说明
基于两个现有DataFrame创建新的DataFrame:从df2中根据Material字段匹配对应的Conversion值,匹配成功则返回该值,未匹配则返回空值,同时必须保留df1的全部数据。
示例数据
df1:
| Material | KG |
|---|---|
| 1 | 10 |
| 2 | 50 |
| 3 | 100 |
| 4 | 80 |
| 5 | 60 |
df2:
| Material | Conversion |
|---|---|
| 1 | 1.5 |
| 3 | 5 |
| 5 | 12 |
期望结果df3
| Material | KG | Conversion |
|---|---|---|
| 1 | 10 | 1.5 |
| 2 | 50 | |
| 3 | 100 | 5 |
| 4 | 80 | |
| 5 | 60 | 12 |
原代码问题
原代码使用了默认的join操作(内连接),只会返回两边Material字段匹配的记录,导致df1中未匹配的记录(Material=2、4)丢失:
df3 = df1.join(df2,["Material"]).withColumnRenamed("Material", "Material_new").drop("Material_new") display(df3)
正确实现代码
使用**左外连接(left join)**即可保留df1的全部数据,未匹配时Conversion字段自动填充为Null:
# 左连接保留df1所有记录,未匹配的Conversion字段为空 df3 = df1.join(df2, on=["Material"], how="left") display(df3)
说明
Spark DataFrame的join方法默认是inner(内连接),仅返回双方匹配的记录。显式指定how="left"(或how="left_outer")后,会保留左表(df1)的所有行,右表(df2)中无匹配的行对应字段会填充为Null,完全符合需求。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

