繁体   English   中英

Spark PySpark 增值滞后/最后 function 与 window

[英]Spark PySpark Increasing value lag/last function with window

我有一个这样的 dataframe (pyspark)

顾客 日期 col_x day_number
1个 2022 年 5 月 10 日 ...(val 无关紧要) NULL
1个 2022 年 5 月 11 日 ... NULL
1个 2022 年 5 月 12 日 ... 0
1个 2022 年 5 月 13 日 ... NULL
1个 2022 年 5 月 14 日 ... NULL
1个 2022 年 5 月 15 日 ... 3个
1个 2022 年 5 月 16 日 ... 4个
1个 2022 年 5 月 17 日 ... NULL
1个 2022 年 5 月 18 日 ... 6个
2个 2022 年 5 月 10 日 ...(val 无关紧要) NULL
2个 2022 年 5 月 11 日 ... NULL
2个 2022 年 5 月 12 日 ... 0
2个 2022 年 5 月 13 日 ... NULL
2个 2022 年 5 月 14 日 ... 2个
2个 2022 年 5 月 15 日 ... 3个
2个 2022 年 5 月 16 日 ... NULL
2个 2022 年 5 月 17 日 ... 5个
2个 2022 年 5 月 18 日 ... NULL

并且这种模式对许多客户重复。

我想要的是填充之间的数字(例如,对于 5/13 和 5/14 的客户 1,天数将是 1 和 2)并且它应该始终增加 1,因为每个日期值都已填充。

我已经尝试了一个滞后 function,我相信这会起作用(下面的代码),但我想知道是否有任何其他方法可以做到这一点,也许row_number()从每个分组的第一个非空day_number值开始。

这是我试过的

import pyspark.sql.functions as F

window = Window.partitionBy("customer").orderBy("date")


#LAG FUNCTION SEEMS TO WORK
df.select(
F.coalesce(F.col("day_number"), F.lit(F.lag(F.col("day_number")).over(window)) + 1)
)
#SOME ROW_NUMBER() FUNCTION , DOES NOT WORK -- 
df.select(
F.coalesce(F.col("day_number"), F.row_number().over(window) + F.lit(F.min("day_number").over(window) - 1)).alias("day_number")
)

很好奇是否还有其他解决方案,我也在想有一种方法可以使用F.last() ,但是需要有一种方法来添加偏移量 (+1,+2,+3 ) ETC...

谢谢!

一种解决方案绝对可以通过这种方式完成:

window = Window.partitionBy("customer").orderBy("date")

df.select(F.when(F.datediff(F.col("date"),F.first(F.when(F.col("day_number") == 0, F.col("date")), ignorenulls=True).over(fill_window))>=0,F.datediff(F.col("date"),F.first(F.when(F.col("day_number") == 0, F.col("date")), ignorenulls=True).over(fill_window))).alias("day_number_test")

但这似乎不是最漂亮的解决方案,我很想知道是否存在任何其他立即合并到 window function 中的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM