PySpark按指定日期间隔采样DataFrame并保留各id最后记录问题
问题原因
你现有采样代码的逻辑存在两处核心缺陷,共同导致了该错误:
- 采样逻辑设计错误:没有采用更符合需求的「从后往前的反向贪心采样」逻辑,反而使用了「正向贪心采样+强制追加最后一条记录」的组合逻辑。这种组合逻辑不会校验最后追加的记录和正向采样得到的最后一条记录的间隔,直接将两条都保留。
- 采样后规则校验缺失:追加完每个id的最后一条记录后,没有反向检查新增的最后一条记录和前序已选记录的间隔是否符合要求,也没有删除和最后一条间隔不足指定天数的冗余前序记录。
以你提供的idB数据、14天间隔要求为例:
- 正向采样阶段逻辑错误选中了2002-02-27这条记录
- 后续代码强制追加了必须保留的最后一条记录2002-02-28
- 没有做间隔校验就直接输出,最终保留了间隔仅1天的两条不符合规则的记录
正确实现逻辑参考
要彻底解决该问题,建议使用反向贪心采样方案,天然适配「最后一条必须保留」的要求:
- 对每个id下的记录按日期降序排序
- 默认选中第一条(也就是原数据中该id的最后一条记录,自动满足强制保留要求)
- 继续往后遍历(对应原数据的更早日期),每次遇到和最后一条选中记录的间隔>=指定天数的记录就选中
- 最后将所有选中的记录按日期升序排序,就是完全符合要求的采样结果
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

