我有一个处理流动行的弹簧批处理作业。我正在使用标准的阅读器,处理器和写入器模式。
load_id policy_number slice_numb asset_code surrender_value
923 V317865 V317865 XXH XXH 46230.340000
923 V318291 V318291 XXA XXA 40664.230000
923 V318757 V318757 XXA XXA 73263.360000
923 V318757 V318757 XXF XXF 36575.820000
923 V318757 V318757 XXI XXI 8723.330000
923 V318782 V318782 XXI XXI 9141.550000
923 V318782 V318782 XXF XXF 28329.550000
923 V318782 V318782 XXA XXA 76776.220000
对于我处理的每一行,我需要获得具有相同policy_number的行的SUM(surrender_value)。注意policy_number V318757作为三行的示例。我需要报告这一行提供的总投降价值的百分比。
我对如何实现这一点有两个想法,但不确定哪种方法更好
第一个选项 - 将SUM / Grouping逻辑移动到阅读器使用的SQL查询。这意味着我需要的所有信息都可供处理器使用,但我必须映射一些额外的字段。
第二个选项 - 为了聚合行,我要添加一个预处理器,它将维护每个policy_number的总计映射和受影响的行列表。一旦该处理器完成,我将生成的数据结构传递给第二个处理器,该处理器将执行标准工作。我担心的是,当我缓存这么多行的细节时,内存占用量会变得非常大。
任何建议或指导都将不胜感激。
答案 0 :(得分:4)
我建议在SQL查询中进行这种类型的聚合。除非这个来自的数据模型非常复杂,否则通过SQL添加这种类型的聚合应该是直截了当的,并且可以解决在处理器/写入器中执行此操作的块边界等问题(例如,如果前两个记录对于V318757出现在一个块中,最后一个出现在另一个块中,您可能无法得到正确的数学。您可以使用自定义的CompletionPolicy处理此问题,但这会增加复杂性。)