如何在PySpark中合并两个列名一致的DataFrame并保留所有数据行
PySpark 同列名DataFrame合并方案
你需要合并两个列结构完全一致的DataFrame并保留所有行,直接使用PySpark内置算子即可实现,具体方案如下:
核心实现代码
因为两个DataFrame列名完全相同,优先使用unionByName算子,它会按照列名对齐合并,避免列顺序不一致导致的数据错位问题:
# 合并两个DataFrame全量数据 merged_df = df1.unionByName(df2)
如果确认两个DataFrame的列顺序完全一致,也可以直接使用union(Spark 2.0+版本中unionAll已成为union的别名,二者功能完全相同):
merged_df = df1.union(df2)
如果需要匹配你给出的预期输出排序效果,加上按Item Id和model排序的逻辑即可:
result_df = merged_df.orderBy("Item Id", "model")
完整可测试示例
以下是包含模拟数据构造的完整可运行代码:
from pyspark.sql import SparkSession # 初始化SparkSession spark = SparkSession.builder.appName("merge_df_demo").getOrCreate() # 构造DF1数据 df1_data = [ (1, "item 1", 22, 100), (2, "item 2", 33, 300), (3, "item 3", 44, 400), (4, "item 4", 55, 500) ] df1 = spark.createDataFrame(df1_data, schema=["Item Id", "item", "model", "price"]) # 构造DF2数据 df2_data = [ (1, "item 1", 222, 1000), (1, "item 1", 2222, 10000), (2, "item 2", 333, 3000), (3, "item 3", 444, 4000), (4, "item 4", 555, 5000) ] df2 = spark.createDataFrame(df2_data, schema=["Item Id", "item", "model", "price"]) # 合并并排序 result_df = df1.unionByName(df2).orderBy("Item Id", "model") # 打印结果 result_df.show(truncate=False)
运行后输出结果和你提供的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Santosh Reddy Kommidi
相关产品推荐
相关产品推荐

