apache-spark - PySpark 连接 ID,然后连接 'date' 列中的年份和月份

标签 apache-spark date join pyspark apache-spark-sql

我有 2 个 PySpark 数据框,想要加入“ID”,然后加入“date1”和“date2”列的,然后加入相同的日期列。

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))

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

最佳答案

你可以这样:

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|
# +---+----+----------+----+----------+

关于apache-spark - PySpark 连接 ID,然后连接 'date' 列中的年份和月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74126993/

相关文章:

mysql连接查询。但是,某些数据没有连接数据

apache-spark - 如何修复 pyspark EMR Notebook 上的错误 - AnalysisException : Unable to instantiate org. apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

scala - 函数与整数值比较时产生 Spark

java - 如何配置 Genson 来反序列化日期?

Java Date/Calendar 对象字符串,比较

mysql - 使用 LEFT JOIN 从不同的表中计数(*)

postgresql - 如何使用 SQL 有效地从一个表中的值中定位另一个表中的值

apache-spark - apache spark 2.2 没有可用的 toString 方法

scala - Spark UDF 返回多个项目

python - 分割大列表的最快方法