我想使用 Spring Batch 处理 CSV 文件。每个 CSV 文件每行包含一条记录。对于给定文件,某些记录可能是相互关联的,即此类记录的处理必须遵循它们在文件中出现的顺序。使用常规顺序方法(即整个文件的单线程)会产生糟糕的性能,因此我想使用分区功能。由于我的处理要求,相互关联的记录必须位于同一分区中(以及它们在文件中出现的顺序)。我考虑了使用基于哈希的分区算法和精心选择的哈希函数的想法(以便创建几乎相同大小的分区)。
知道 Spring Batch 是否可以做到这一点吗?
对于这种情况应该如何实现Partitioner
?根据 Spring Batch 作者/开发人员之一的说法,主站不发送实际数据,仅发送从站获取其应处理的数据所需的信息。就我而言,我猜这个信息就是哈希值。因此,每个从站的 FlatFileItemReader
是否需要跳过具有不同哈希的行来逐行读取整个文件?
谢谢, 米凯尔
最佳答案
您所描述的是批处理中常见的情况。您在这里有几个选择:
- 按顺序拆分文件并根据创建的文件进行分区 - 在这种情况下,您需要遍历文件一次,将其划分为需要按顺序处理的每个记录列表。从那里,您可以使用
MultiResourcePartitioner
并行处理每个文件。 - 将文件加载到临时表中 - 恕我直言,这是更简单的方法。将文件加载到暂存表中。从那里,您可以根据任意数量的因素对处理进行分区。
无论哪种情况,结果都允许您根据需要扩展流程以获得所需的性能。
关于java - 基于哈希的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32362318/