pyspark选择最接近date2值的date1列值,如果date1小于date2,则首选date1,groupby id

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

这是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 它将选择 effc date 最接近 tran date 如果不存在较小的日期,它将检查较大的日期并选择 effc date 最接近 tran 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 |
s5a0g9ez

s5a0g9ez1#

您可以按id和事务日期分组,然后合并条件聚合:

import pyspark.sql.functions as F

df2 = df.groupBy('id', 'tran_date').agg(
    F.coalesce(
        F.max(F.when(F.col('effc_date') < F.col('tran_date'), F.col('effc_date'))), 
        F.min(F.when(F.col('effc_date') >= F.col('tran_date'), F.col('effc_date')))
    ).alias('effc_date')
)

df2.show()
+---+----------+----------+
| 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|
+---+----------+----------+

相关问题