You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark中如何合并两个不同的DataFrame?含门店数据合并场景

在Spark中合并两个DataFrame的方案(针对你的门店数据场景)

这个场景在Spark数据处理里非常典型,核心思路是基于门店ID和周日期这两个共同的标识字段,用join()操作来整合两个DataFrame的数据。下面我结合你的需求具体说明:

第一步:确认连接键的一致性

首先要确保两个DataFrame中用来匹配的字段(门店ID、周日期)名称和数据类型完全一致。比如如果你的第一个DataFrame(门店销量)日期列叫week_date,第二个(燃料价格)叫weekly_date,得先把列名统一:

// Scala示例:重命名副DF的日期列
val renamed_fuel_df = fuel_prices_df.withColumnRenamed("weekly_date", "week_date")
# Python示例:重命名副DF的日期列
renamed_fuel_df = fuel_prices_df.withColumnRenamed("weekly_date", "week_date")

另外要检查日期字段的类型,比如都是DateType而不是字符串,避免因为类型不匹配导致匹配失败。

第二步:选择合适的连接类型

根据你的需求,我推荐两种常用的连接方式:

1. 内连接(Inner Join)—— 只保留双方都有的数据组合

如果你的需求是只保留第一个DataFrame中同时存在于第二个DataFrame的门店ID+日期组合,也就是只整合双方都有数据的记录,用内连接最合适:

// Scala示例
val merged_df = store_sales_df.join(renamed_fuel_df, 
  Seq("store_id", "week_date"),  // 指定连接键
  "inner"  // 连接类型
)
# Python示例
merged_df = store_sales_df.join(renamed_fuel_df, 
  ["store_id", "week_date"],  # 指定连接键
  "inner"  # 连接类型
)

这样得到的结果里,每一行都是既有销量数据又有对应周燃料价格的门店记录。

2. 左连接(Left Join)—— 保留所有主数据,补充匹配到的副数据

如果你想保留第一个DataFrame的所有门店销量记录,同时给那些有对应燃料价格的行补充价格信息(没有匹配到的行燃料价格列会显示null),就用左连接:

// Scala示例
val merged_df = store_sales_df.join(renamed_fuel_df, 
  Seq("store_id", "week_date"), 
  "left"
)
# Python示例
merged_df = store_sales_df.join(renamed_fuel_df, 
  ["store_id", "week_date"], 
  "left"
)

这种方式更适合需要完整保留销量数据,同时尽可能补充额外信息的场景。

额外注意事项

  • 如果第二个DataFrame存在同一个门店+日期的重复记录(比如同周多次记录燃料价格),建议先对其去重或聚合(比如取平均、最新值),避免合并后出现重复行:
    # Python示例:按门店和日期分组,取最新的燃料价格
    cleaned_fuel_df = renamed_fuel_df.groupBy("store_id", "week_date")\
      .agg(max("fuel_price").alias("fuel_price"))
    
  • 可以用show()方法查看合并后的结果,验证是否符合预期:
    merged_df.show(10)
    

内容的提问来源于stack exchange,提问作者Oblivion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:32:27