如何在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
相关产品推荐
相关产品推荐

