PySpark全外连接后按规则覆盖product_name列值的问题
问题分析与解决方案
嘿,你的问题主要出在两个细节上,咱们一步步来修正:
1. coalesce的参数顺序搞反了
你当前用的是f.coalesce(df.product_name, df1.product_name),但coalesce的逻辑是返回第一个非null的参数值。而你的需求是优先用df1的product_name,只有当它为null或者没有对应值时才用df的,所以应该把df1.product_name放在前面,换成f.coalesce(df1.product_name, df.product_name)。
2. customer_id列的取值需要处理
因为是full_outer join,会出现其中一个DataFrame没有对应customer_id的情况(比如df1里最后一行的null customer_id),这时候你直接取df.customer_id就会得到null,但正确的做法是取两个表中customer_id的非null值,也就是用f.coalesce(df.customer_id, df1.customer_id)来获取最终的customer_id。
修正后的完整代码
import pyspark.sql.functions as f # 给DataFrame起别名,让代码更清晰 df_alias = df.alias("a") df1_alias = df1.alias("b") df2 = df_alias.join( df1_alias, on="customer_id", # 直接用列名join,比写等式更简洁 how="full_outer" ).select( f.coalesce(f.col("a.customer_id"), f.col("b.customer_id")).alias("customer_id"), f.coalesce(f.col("b.product_name"), f.col("a.product_name")).alias("product_name"), f.col("a.country") )
验证结果
运行修正后的代码,df2.show()会得到你预期的结果:
+-----------+------------+-------------+ |customer_id|product_name| country| +-----------+------------+-------------+ | 12870946| GS748TS| Poland| | 815518| MA402|United States| | 3138420| WG111v2| UK| | 3178864| WGR614v6|United States| | 7456796| XE102|United States| | 21893468| AGM731F|United States| | null| AE171| null| +-----------+------------+-------------+
另外,join的时候直接用on="customer_id"比写df.customer_id == df1.customer_id更简洁,而且会自动处理两个表的列名一致的情况,避免重复列的问题。
内容的提问来源于stack exchange,提问作者User12345
相关产品推荐
相关产品推荐

