如何在给定日期范围内在pyspark中连接两个 Dataframe

u4dcyp6a  于 2023-05-21  发布在  Spark
关注(0)|答案(1)|浏览(137)

我有以下两个级别的pyspark Dataframe :

df1
client date    dateM1  dateM3  dateP3
123    9-2021  8-2021   6-2021  12-2021
124    8-2022  7-2022   5-2022  11-2022
125    2-2022  1-2022  11-2021   5-2022

df2
client    date   imp   con
123     5-2021   2     0
123     6-2021   4     1
123    10-2021   1     0
124    11-2022   1     1
124    10-2022   2     0
125     8-2022   1     1

我想找到一个客户的总印象和转换,如果他们属于范围1(dateM 3到dateM 1)和范围2(日期到dateP 3)。我想避免交叉连接两个集合来比较日期。
结果数据应该是这样的:

df
client imp_Range1 con_Range1 imp_Range2 con_Range2
123    4          1          1          0  
124    0          0          3          1

如果没有imp和con落在给定的范围内,它不应该是最终集合的一部分
注:日期为字符串格式(M-yyyy)

li9yvcax

li9yvcax1#

导入必要的包

from pyspark.sql.functions import col, when, sum, to_date

1.将日期从StringType转换为DateType

cast_date = lambda df, column: df.withColumn(column, to_date(column, "M-yyyy"))

df1 = df1 \
    .transform(cast_date, "dateM3") \
    .transform(cast_date, "dateM1") \
    .transform(cast_date, "date") \
    .transform(cast_date, "dateP3")

df2 = df2.transform(cast_date, "date")

1.使用条件语句联接并执行groupby求和

joined_df = df1.join(df2, "client")

condition1 = col("dateChng").between(col("dateM3"), col("dateM1"))
condition2 = col("dateChng").between(col("date"), col("dateP3"))

conditional_sum = lambda condition, col_name, col_alias: sum(when(condition, col(col_name)).otherwise(0)).alias(col_alias)

joined_df = joined_df.groupBy("client").agg(
    conditional_sum(condition1, "imp", "imp_range1"),
    conditional_sum(condition1, "con", "con_range1"),
    conditional_sum(condition2, "imp", "imp_range2"),
    conditional_sum(condition2, "con", "con_range2")
)

filter_cond = "imp_range1!=0 OR con_range1!=0 OR imp_range2!=0 OR con_range2!=0"

joined_df.filter(filter_cond).show()

输出:

+------+----------+----------+----------+----------+
|client|imp_range1|con_range1|imp_range2|con_range2|
+------+----------+----------+----------+----------+
|   123|         4|         1|         1|         0|
|   124|         0|         0|         3|         1|
+------+----------+----------+----------+----------+

相关问题