Join 如何优化pyspark连接并填充最后一次发生?
我有两个数据帧:stage_更改、旅程及其描述如下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")))
@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。