【问题标题】:Joining 2 dataframes pyspark加入2个数据框pyspark
【发布时间】:2022-01-26 11:36:26
【问题描述】:

我是 Pyspark 的新手。 我在下面的 2 个表中有这样的数据。我正在使用数据框。

表 1:

Id Amount Date
1 £100 01/04/2021
1 £50 08/04/2021
2 £60 02/04/2021
2 £20 06/05/2021

表 2:

Id Status Date
1 S1 01/04/2021
1 S2 05/04/2021
1 S3 10/04/2021
2 S1 02/04/2021
2 S2 10/04/2021

我需要加入上面的这 2 个数据帧以产生如下输出。

对于表 1 中的每条记录,我们需要从表 2 中获取自 Date 起有效的记录,反之亦然。例如,table108/04/2021 上有£50 用于Id=1,但表2 在05/04/2021 上有Id=1 的记录,其中状态更改为S2。因此,对于08/04/2021,状态为S2。这就是我不确定如何在连接条件中给出这个输出

实现这一目标的有效方法是什么?

预期输出:

Id Status Date Amount
1 S1 01/04/2021 £100
1 S2 05/04/2021 £100
1 S2 08/04/2021 £50
1 S3 10/04/2021 £50
2 S1 02/04/2021 £60
2 S2 10/04/2021 £60
2 S2 06/05/2021 £20

【问题讨论】:

  • don't post dataframe data as images,使用文本格式。另外,加入条件是什么?
  • 嗨@blackbishop,我已经删除了图像并使用了表格格式。对于表 1 中的每条记录,我们需要使表 2 中的记录在该日期有效,反之亦然。例如,table1 在 2021 年 8 月 4 日有 50 英镑的 id1,但表 2 在 2021 年 5 月 4 日有 id 1 的记录,其中状态更改为 S2。因此,对于 2021 年 8 月 4 日,状态为 S2。这就是我不确定如何在连接条件中给出这个输出

标签: dataframe apache-spark pyspark apache-spark-sql


【解决方案1】:

IdDate 上使用完全连接,然后使用lag 窗口函数从最接近的Date 行中获取StatusAmount 的值:

from pyspark.sql import Window
import pyspark.sql.functions as F

w = Window.partitionBy("Id").orderBy(F.to_date("Date", "dd/MM/yyyy"))

joined_df = df1.join(df2, ["Id", "Date"], "full").withColumn(
    "Status",
    F.coalesce(F.col("Status"), F.lag("Status").over(w))
).withColumn(
    "Amount",
    F.coalesce(F.col("Amount"), F.lag("Amount").over(w))
)

joined_df.show()
#+---+----------+------+------+
#| Id|      Date|Amount|Status|
#+---+----------+------+------+
#|  1|01/04/2021|  £100|    S1|
#|  1|05/04/2021|  £100|    S2|
#|  1|08/04/2021|   £50|    S2|
#|  1|10/04/2021|   £50|    S3|
#|  2|02/04/2021|   £60|    S1|
#|  2|10/04/2021|   £60|    S2|
#|  2|06/05/2021|   £20|    S2|
#+---+----------+------+------+

【讨论】:

  • 嗨@blackbishop,我已经尝试了你的解决方案,它工作得很好。我所做的唯一更改是按 id 和日期排序
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多