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
相关产品推荐
相关产品推荐

