Pyspark:按 ID 和最近日期向后连接 2 个数据帧

Nic*_*ick 6 python sql join pyspark

我在 pyspark(以及一般的 python)中执行两个数据帧的滚动连接时遇到了很多问题。我希望通过 ID 和最近的日期将两个 pyspark 数据帧连接在一起(意味着第二个数据帧中的日期不能大于第一个数据帧中的日期)

表格1:

+-----+------------+--------+ |  身份证 |  日期 |  价值|  +-----+------------+--------+ |  A1 |  2020年1月15日 |  5 |  |  A2 |  2020年1月20日 |  10 | 10  |  A3|  2020年2月21日 |  12 | 12  |  A1 |  2020年2月21日 |  6 |  +-----+------------+--------+

表_2:

在此输入图像描述

期望的结果:

ID 日期 值 值 2 A1 01-15-2020 5 5 A2 01-20-2020 10 12 A3 02-21-2020 12 14 A1 01-21-2020 6 3

本质上,我知道 SQL 查询可以完成我可以做的事情,我可以做spark.sql(“query”)所以其他任何事情。我已经尝试了一些在 Spark 环境中不起作用的方法。谢谢!

Lam*_*nus 2

这是我的审判。

首先,我确定哪个Date_2符合您的条件。之后,再次加入第二个数据框并得到Value_2

from pyspark.sql.functions import monotonically_increasing_id, unix_timestamp, max

df3 = df1.withColumn('newId', monotonically_increasing_id()) \
  .join(df2, 'ID', 'left') \
  .where(unix_timestamp('Date', 'M/dd/yy') >= unix_timestamp('Date_2', 'M/dd/yy')) \
  .groupBy(*df1.columns, 'newId') \
  .agg(max('Date_2').alias('Date_2'))
df3.orderBy('newId').show(20, False)    

+---+-------+-----+-----+-------+
|ID |Date   |Value|newId|Date_2 |
+---+-------+-----+-----+-------+
|A1 |1/15/20|5    |0    |1/12/20|
|A2 |1/20/20|10   |1    |1/11/20|
|A3 |2/21/20|12   |2    |1/31/20|
|A1 |1/21/20|6    |3    |1/16/20|
+---+-------+-----+-----+-------+

df3.join(df2, ['ID', 'Date_2'], 'left') \
  .orderBy('newId') \
  .drop('Date_2', 'newId') \
  .show(20, False)

+---+-------+-----+-------+
|ID |Date   |Value|Value_2|
+---+-------+-----+-------+
|A1 |1/15/20|5    |5      |
|A2 |1/20/20|10   |12     |
|A3 |2/21/20|12   |14     |
|A1 |1/21/20|6    |3      |
+---+-------+-----+-------+
Run Code Online (Sandbox Code Playgroud)