Apache spark Pyspark选择最接近date2值的date1列值,如果date1小于date2,则首选date1,groupby ID

Apache spark Pyspark选择最接近date2值的date1列值,如果date1小于date2,则首选date1,groupby ID,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,这是SQL中的逻辑: coalesce(if effc_dt <= tran_dt select(max of effc_dt) , if effc_dt >= tran_dt select (min of effc_dt)) 预期产出: |id|tran_date |effc_date | |--|-----------|-----------| |12|2020-02-01 |2019-02-01 | |34|2020-02-01 |2020-02-15 | |40|202

这是SQL中的逻辑:

coalesce(if effc_dt <= tran_dt select(max of effc_dt) , if effc_dt >= tran_dt select (min of effc_dt))
预期产出:

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

您可以按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|
+---+----------+----------+
导入pyspark.sql.F函数
df2=df.groupBy('id','tran_date').agg(
聚结(
F.max(F.when(F.col('effc_date')=F.col('trans_日期')、F.col('effc_日期'))
).别名(“生效日期”)
)
df2.show()
+---+----------+----------+
|id |传输日期|生效日期|
+---+----------+----------+
| 12|2020-02-01|2019-02-01|
| 34|2020-02-01|2020-02-15|
| 40|2020-02-01|2019-02-15|
+---+----------+----------+
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|
+---+----------+----------+