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

如何在PySpark中按ID及日期的年、月关联两个DataFrame?

按ID及日期年月关联PySpark DataFrame的正确实现

你的代码存在几个语法问题:

  • ID字段的关联条件未正确写为df1.ID == df2.ID
  • 括号未闭合
  • 若date1/date2是字符串类型,需先转换为日期类型才能使用year()/month()函数

下面提供两种可行的实现方式:

方法一:直接在Join条件中计算年月

先确保日期列是日期类型(如果原数据是字符串格式),然后在join条件里同时匹配ID、年份、月份:

from pyspark.sql import functions as F

# 若date1/date2是字符串类型,先转换为日期类型
df1 = df1.withColumn("date1", F.to_date(F.col("date1"), "yyyy-MM-dd"))
df2 = df2.withColumn("date2", F.to_date(F.col("date2"), "yyyy-MM-dd"))

# 执行关联
result_df = df1.join(
    df2,
    (df1.ID == df2.ID) & 
    (F.year(df1.date1) == F.year(df2.date2)) & 
    (F.month(df1.date1) == F.month(df2.date2)),
    how="inner"
).select(
    df1.ID, df1.col1, df1.date1, df2.col2, df2.date2
)

# 查看结果
result_df.show()

方法二:先添加年月列再关联

先给两个DataFrame添加统一的year_month列,再用ID和year_month进行关联,逻辑更直观:

from pyspark.sql import functions as F

# 转换日期类型并添加年月列
df1 = df1.withColumn("date1", F.to_date(F.col("date1"), "yyyy-MM-dd")) \
         .withColumn("year_month", F.date_format(F.col("date1"), "yyyy-MM"))

df2 = df2.withColumn("date2", F.to_date(F.col("date2"), "yyyy-MM-dd")) \
         .withColumn("year_month", F.date_format(F.col("date2"), "yyyy-MM"))

# 关联后移除临时的年月列
result_df = df1.join(
    df2,
    ["ID", "year_month"],
    how="inner"
).drop("year_month") \
 .select("ID", "col1", "date1", "col2", "date2")

result_df.show()

两种方法都能得到你期望的输出结果,方法二更适合需要多次使用年月维度的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:35:23