我有一个任务是将 mongo db 文档集合转换为 CSV 文件。这些文件是客户购买的。许多客户进行了近百万次购买。我想将其写入 CSV 文件,其中 csv 的大小不超过 100mb。主要问题是订单中一起购买的客户商品应该位于同一个文件中。我还需要使用线程并行处理它。问题是订单和用户数以百万计,因此我无法将每个用户写入单个文件。任何想法如何使用 spring Batch 解决这个问题。文档包含purchase_id和order_id。
我尝试了一切,从使用 mongo db 中的聚合对订单 ID 进行分组,以及使用任务执行器创建 10 个分区。但它非常慢,导致一些线程拥有巨大的文档列表,而其他线程却很少。
Spring Batch面向块的处理模型不适合聚合,但可以使用驱动查询模式https://docs.spring.io/spring-batch/reference/common-patterns.html#drivenQueryBasedItemReaders。读取器将获取订单(通过订单 ID),处理器将查询当前订单的商品。众所周知,这种模式对于大型数据集来说速度很慢(但对于小型/中型数据集来说应该没问题),因为它会为每个项目发出额外的查询。这是模式本身的问题,而不是 Spring Batch 的问题。