You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark按条件获取指定时间范围内code=0对应前一行zip值的问题

问题解决方法

你现有代码不符合预期有两个核心原因:

  • 未对当前行的code做过滤:不管当前行code是不是0,都会计算前序的zip值,导致code=4的行也返回了结果
  • 使用F.last时没有开启忽略空值参数:默认F.last不会跳过窗口内的null值,无法正确提取到最后一个非空的code=0对应的zip

修改后完整代码

from pyspark.sql import functions as F
from pyspark.sql import Window

# 先生成unix时间戳列,供窗口range计算使用
df = df.withColumn("timestamp", F.unix_timestamp("trandatetime"))

# 窗口定义保持不变,按id分组,按时间戳排序,取过去24小时的前序行
w = Window.partitionBy('id').orderBy('timestamp').rangeBetween(-60*60*24, -1)

# 计算逻辑修改:
# 1. 只有当前行code=0时才计算取值,否则直接返回null
# 2. last函数加ignorenulls=True,跳过窗口内的null值,取最近的非空zip
df = df.withColumn(
    "Card_Present_Last_Zip",
    F.when(
        F.col("code") == '0',
        F.last(F.when(F.col("code") == '0', F.col("zip")), ignorenulls=True).over(w)
    )
)

执行后预期结果

idtrandatetimecodeziptimestampCard_Present_Last_Zip
12020-02-06 17:33:210357631581010401null
12020-02-06 17:39:55035763158101079535763
12020-02-07 06:06:42035741158105560235763
12020-02-07 06:28:174940431581056897null
12020-02-07 07:12:13035802158105953335741
12020-02-07 08:23:29030738158106380935802

内容的提问来源于stack exchange,提问作者user1389739

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:57:03