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

基于PySpark窗口函数实现按条件校验滞后行的状态筛选

PySpark 实现方案

核心逻辑

无需拆分两种场景单独处理,只需要对每个ID分组后按时间升序排序,判断每条STAT=200的记录后续所有状态的最小值是否符合要求即可,可直接兼容你已经实现的「最后一条是200」的场景。

具体实现步骤

  • 第一步:导入依赖的函数与窗口类
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, min
from pyspark.sql.window import Window
  • 第二步:定义按ID分组、时间升序排序的窗口
# 按ID分区,TIME升序排列,窗口范围取当前行之后的所有行
w = Window.partitionBy("ID").orderBy("TIME").rowsBetween(Window.currentRow + 1, Window.unboundedFollowing)
  • 第三步:新增后续状态最小值列,过滤符合要求的记录
# 此处替换为你的源数据集变量名即可,示例中假设源数据集名为df
result_df = df.withColumn("next_min_stat", min("STAT").over(w)) \
    .filter(
        (col("STAT") == 200) & 
        # 满足任意一个条件即可:1. 后续无记录(是当前ID的最后一条状态);2. 后续所有状态的最小值≥200
        (col("next_min_stat").isNull() | (col("next_min_stat") >= 200))
    ) \
    # 可选操作:不需要中间计算列可直接删除
    .drop("next_min_stat")

效果验证

  • 对应示例1:ID1的200状态后存在150,next_min_stat取值为150<200,会被过滤,仅保留ID2的200记录,符合要求
  • 对应示例2:ID1的200状态后为350、400,next_min_stat取值为350≥200,会被保留,两个ID的200记录都留存,符合要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:06