繁体   English   中英

如何在Spring Batch中读取多个CSV文件以合并数据进行处理?

[英]How to read multiple CSV files in Spring Batch to merge the data for processing?

我是Spring Batch的新手,正在尝试获取有关以下要求的指南。

总体要求:

我必须从不同的系统中获取数据,应用一些业务逻辑,并将结果保存在DB中。

下面是一个例子。

我需要从3个CSV文件中读取数据。 第一个文件– person.csv –包含名称和ID。第二个文件– address.csv –包含每个人的地址信息。 一个人可以有零个或多个地址。
第三个文件– Employment.csv –包含每个人的就业信息。 一个人可以有零个或多个雇主。

这是一些示例。

Person.csv ###(总大小为800万)

“ personID”,“ personName”

1,乔伊

2,钱德勒

3,罗斯

4,莫妮卡

地址.csv

“ personID”,“ addressType”,“ state”

纽约市1号住宅

1,邮寄,数控

纽约市2号住宅

纽约市4号住宅

4,邮寄,DC

职业.csv

“ personID”,“ employerName”

1,emp1

2,emp2

2,emp3

3,emp4

注意:每个文件均按人员ID排序。

要应用业务逻辑,我需要合并每个人的数据,即,我需要合并一个人的人,地址,就业数据以应用逻辑。 您能为此建议任何方法吗?

这听起来像一个4 ,工作。 您必须确定步骤1到3的中间结果应该在哪里。

如果所有CSV文件中的数据都可以存储在内存中,则步骤1至3的中间结果可能只是一个Map ,并以personID作为键。 如果不是,则步骤1至3的中间结果可能应该写入数据库的临时表中。

假设所有数据都可以容纳在内存中,请创建一个可以注入到步骤1到步骤3的ItemWriters中的bean,例如:

// in a config class...
// assuming PersonID is of type Long
// Assuming Person class has appropriate attributes
Map<Long, Person> people = new HashMap<>();

第1步:

  • ItemReader-读取下一个Person.CSV行并创建一个Person实例
  • ItemProcessor-无关紧要-将Person实例传递给ItemWriter
  • ItemWriter -增加Person实例到people地图(或中间表)。

第2步:

  • ItemReader-读取下一个Address.CSV行并创建一个Address实例
  • ItemProcessor-无关紧要-将Address实例传递给ItemWriter
  • ItemWriter-将地址从people映射(或中间表)添加到相关的人员。 待办事项:如果不存在某人的地址,该怎么办?

第三步:

  • ItemReader-读取下一个Job.CSV行并创建一个Job实例
  • ItemProcessor-无关紧要-将Jobing实例传递给ItemWriter
  • ItemWriter-从people图(或中间表)向相关人员添加就业。 待办事项:如果某人不存在工作,该怎么办?

由于第1到第3步中ItemProcessor不需要执行任何操作,因此最好使用Tasklet。

同样,步骤1至3可以并行进行。 这可能会提高性能,但是会增加复杂性以确保people正确填充。

第四步:

  • ItemReader -读取的下一个元素people (或从中间表复合对象)
  • ItemProcessor-应用业务逻辑
  • ItemWriter-将结果写入数据库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM