Join 如何优化pyspark连接并填充最后一次发生?

Join 如何优化pyspark连接并填充最后一次发生?,join,pyspark,Join,Pyspark,我有两个数据帧:stage_更改、旅程及其描述如下 @udf("array<integer>") def day_range(start_day, end_day): return list(range(start_day, end_day+1)) all_journey_days = journeys \ .withColumn("day_range", day_range(col("starting_day"), col("ending_day")))

我有两个数据帧:stage_更改、旅程及其描述如下

@udf("array<integer>")
def day_range(start_day, end_day):
    return list(range(start_day, end_day+1))


all_journey_days = journeys \
        .withColumn("day_range", day_range(col("starting_day"), col("ending_day"))) \
        .select(["account_id", "candidate_id", explode("day_range").alias("day_num")])

window = Window().partitionBy(["account_id", "candidate_id"]).orderBy("day_num") \
        .rowsBetween(Window.unboundedPreceding, 0)

all_day_stage_changes = all_journey_days \
        .join(stage_changes, on=["account_id", "candidate_id", "day_num"], how="left") \
        .withColumn("final_level_id", last(col("level_id"), ignorenulls=True).over(window))

在我的应用程序中,每个候选人在开始的那天都会被关联到一个level_id。候选人的级别在取得某些进展时会发生变化,所以级别变化之间的天数并不是固定的

例如,candiate-A在第0天处于0级,然后在第5天处于1级,然后在第25天直接处于4级。此数据在dataframe阶段_更改中跟踪

stage_changes:

account_id | candidate_id | day_num | level_id
    21     |     23097    |    0    |    0
    21     |     23097    |    5    |    1
    21     |     23097    |    25   |    4
    45     |     53838    |    4    |    0
    45     |     23097    |    30   |    7
    21     |     23056    |    45   |    1

每个候选人都有一段特定的活动时间,即从开始到结束。这在另一个数据帧过程中被跟踪

journeys:

account_id | candidate_id | starting_day | ending_day
    21     |     23097    |    0         |    76
    45     |     53838    |    4         |    45
    21     |     23056    |    45        |    101

我希望在每个候选人的旅程中,每天都能获得其级别id。我目前的做法如下:

@udf("array<integer>")
def day_range(start_day, end_day):
    return list(range(start_day, end_day+1))


all_journey_days = journeys \
        .withColumn("day_range", day_range(col("starting_day"), col("ending_day"))) \
        .select(["account_id", "candidate_id", explode("day_range").alias("day_num")])

window = Window().partitionBy(["account_id", "candidate_id"]).orderBy("day_num") \
        .rowsBetween(Window.unboundedPreceding, 0)

all_day_stage_changes = all_journey_days \
        .join(stage_changes, on=["account_id", "candidate_id", "day_num"], how="left") \
        .withColumn("final_level_id", last(col("level_id"), ignorenulls=True).over(window))


你的spark版本是什么?是否有任何连接数据帧小于8GB?spark2.2和否,数据大于8GB。您的spark版本是什么?是否有任何连接数据帧小于8GB?spark2.2和否,数据大于8GB。