【问题标题】:Spring Batch - Aggregating ProcessorSpring Batch - 聚合处理器
【发布时间】:2014-02-24 17:52:05
【问题描述】:

我有一个处理流动行的春季批处理作业。我正在使用标准的阅读器、处理器和编写器模式。

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/分组逻辑移动到读者使用的 SQL 查询中。这意味着我需要的所有信息都可供处理器使用,但我必须映射一些额外的字段。

第二个选项 - 为了聚合行,我将添加一个预处理器,该预处理器将维护每个 policy_number 的总数的映射和受影响的行列表。一旦这个处理器完成,我会将生成的数据结构传递给第二个处理器,该处理器将完成标准工作。我担心的是内存占用可能会变得非常大,因为我缓存了这么多行的详细信息。

任何建议或指导将不胜感激。

【问题讨论】:

标签: spring-batch


【解决方案1】:

我建议在 SQL 查询中进行这种类型的聚合。除非来自的数据模型非常复杂,否则通过 SQL 添加这种类型的聚合应该是直截了当的,并且可以消除在处理器/写入器中执行此操作可能导致的块边界等问题(例如,如果前两条记录对于 V318757 出现在一个块中,最后一个出现在另一个块中,您可能无法正确计算数学。您可以使用自定义 CompletionPolicy 处理此问题,但这会增加复杂性)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多