PySpark从“日期”列开始先联接ID,然后联接年份和月份

b09cbbtk  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(157)

我有2个PySpark Dataframe ,想在“ID”上加入,然后在“date1”和“date2”列的 year 上加入,然后在相同日期列的 month 上加入。
df1:

ID   col1     date1
1    1     2018-01-05
1    2     2018-02-05
2    4     2018-04-05
2    1     2018-05-05
3    1     2019-01-05
3    4     2019-02-05

DF2:

ID   col2     date2
1    1     2018-01-08
1    1     2018-02-08
2    4     2018-04-08
2    3     2018-05-08
3    1     2019-01-08
3    4     2019-02-08

预期输出:

ID   col1     date1     col2     date2
1    1     2018-01-05    1     2018-01-08
1    2     2018-02-05    1     2018-02-08
2    4     2018-04-05    4     2018-04-08
2    1     2018-05-05    3     2018-05-08
3    1     2019-01-05    1     2019-01-08
3    4     2019-02-05    4     2019-02-08

我试着这样做:

df = df1.join(df2, (ID & (df1.F.year(date1) == df2.F.year(date2)) & (df1.F.month(date1) == df2.F.month(date2))

如何加入日期的月份和年份?

ff29svar

ff29svar1#

你可以这样对它:

join_on = (df1.ID == df2.ID) & \
          (F.year(df1.date1) == F.year(df2.date2)) & \
          (F.month(df1.date1) == F.month(df2.date2))
df = df1.join(df2, join_on)

完整示例:

from pyspark.sql import functions as F
df1 = spark.createDataFrame(
    [(1, 1, '2018-01-05'),
     (1, 2, '2018-02-05'),
     (2, 4, '2018-04-05'),
     (2, 1, '2018-05-05'),
     (3, 1, '2019-01-05'),
     (3, 4, '2019-02-05')],
    ['ID', 'col1', 'date1'])
df2 = spark.createDataFrame(
    [(1, 1, '2018-01-08'),
     (1, 1, '2018-02-08'),
     (2, 4, '2018-04-08'),
     (2, 3, '2018-05-08'),
     (3, 1, '2019-01-08'),
     (3, 4, '2019-02-08')],
    ['ID', 'col2', 'date2'])

join_on = (df1.ID == df2.ID) & \
          (F.year(df1.date1) == F.year(df2.date2)) & \
          (F.month(df1.date1) == F.month(df2.date2))
df = df1.join(df2, join_on).drop(df2.ID)

df.show()

# +---+----+----------+----+----------+

# | ID|col1|     date1|col2|     date2|

# +---+----+----------+----+----------+

# |  1|   1|2018-01-05|   1|2018-01-08|

# |  1|   2|2018-02-05|   1|2018-02-08|

# |  2|   4|2018-04-05|   4|2018-04-08|

# |  2|   1|2018-05-05|   3|2018-05-08|

# |  3|   1|2019-01-05|   1|2019-01-08|

# |  3|   4|2019-02-05|   4|2019-02-08|

# +---+----+----------+----+----------+

相关问题