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

PySpark下实现订单与取消单按规则扣减并追踪剩余量

订单与取消单的PySpark扣减处理问题

拥有两个DataFrame,结构均为[unique_id_line, reference, qty, date],分别存储订单数据与取消单数据。需要通过reference字段将取消单中的数量从对应订单中扣减,最终保留未被完全取消的订单;若订单被部分取消,则更新其qty值。

处理规则

  • 取消单优先扣减相同reference、日期最近且不晚于取消单日期的订单数量;
  • 若取消量超出当前订单剩余量,继续扣减下一个更早日期的订单;
  • 处理顺序从最新的取消单开始。

示例说明

示例1

订单数据

[
    [id1, ref1, 5, 10/04/2023], 
    [id2, ref1, 10, 20/04/2023], 
    [id3, ref1, 2, 30/04/2023], 
    [id6, ref2, 2, 01/04/2023]
]

取消单数据

[
    [id4, ref1, 12, 25/04/2023], 
    [id5, ref1, 2, 30/04/2023]
]

预期结果

[
    [id1, ref1, 3, 10/04/2023], 
    [id6, ref2, 2, 01/04/2023]
]

说明:id5(最新取消单,日期30>25)全额扣减id3;id4扣减id2的10个单位及id1的2个单位;id6因无对应取消单未修改。

示例2

订单数据

[
    [id1, ref1, 42, 10/04/2023],
    [id2, ref1, 42, 10/04/2023],
    [id5, ref1, 42, 10/04/2023]
]

取消单数据

[
    [id3, ref1, 42, 10/04/2023],
    [id4, ref1, 42, 10/04/2023],
    [id6, ref1, 13, 30/04/2023]
]

预期结果

[
    [id5, ref1, 29, 10/04/2023]
]

说明:id6(最新取消单)扣减id1的13个单位,剩余29;id4扣减id1剩余的29个单位及id2的13个单位;id3扣减id2剩余的29个单位及id5的13个单位,id5剩余29。

示例3

订单数据

[
    [id1, ref1, 42, 10/04/2023],
    [id2, ref1, 42, 11/04/2023],
    [id5, ref1, 42, 12/04/2023]
]

取消单数据

[
    [id3, ref1, 43, 15/04/2023]
]

预期结果

[
    [id1, ref1, 42, 10/04/2023],
    [id2, ref1, 41, 11/04/2023],
]

说明:id3全额扣减id5的42个单位,再扣减id2的1个单位。

当前困境

目前基于window和lag函数编写的代码不够简洁,且无法适配多取消单关联多订单的场景。核心难点在于无法追踪取消单剩余可扣减的数量——lag函数无法复用之前计算的行,且PySpark中不能直接使用循环处理。需要可行的解决方案或思路指引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:42:44