spark sql-select在两个日期列中差异最小的记录

vx6bjr1n  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(321)

这是sql中的逻辑:

coalesce(if effc_dt <= tran_dt select(max of effc_dt) , if effc_dt >= tran_dt select (min of effc_dt)).

我想在pyspark中有类似的逻辑,当effc date小于tran date时,它将选择最接近tran date的effc date,如果不存在较小的date,它将检查较大的值并选择最接近tran date的effc date。
输入Dataframe:

|id|tran_date  |effc_date  |
|--|-----------|-----------|
|12|2020-02-01 |2019-02-01 |
|12|2020-02-01 |2018-02-01 |
|34|2020-02-01 |2021-02-15 |
|34|2020-02-01 |2020-02-15 |
|40|2020-02-01 |2019-02-15 |
|40|2020-02-01 |2020-03-15 |

预期产量:

|id|tran_date  |effc_date  |
|--|-----------|-----------|
|12|2020-02-01 |2019-02-01 |
|34|2020-02-01 |2020-02-15 |
|40|2020-02-01 |2019-02-15 |
rbl8hiat

rbl8hiat1#

您可以按日期差排序,并将结果限制为1行:

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'rn', 
    F.row_number().over(
        Window.partitionBy('ID')
              .orderBy(F.datediff('start_date', 'end_date'))
    )
).filter('rn = 1').drop('rn')

df2.show()
+---+----------+----------+
| id|start_date|  end_date|
+---+----------+----------+
| 34|2021-02-01|2019-02-01|
| 12|2020-02-01|2019-02-01|
+---+----------+----------+

相关问题