【发布时间】:2016-04-08 14:45:58
【问题描述】:
我的任务是比较两个大的 csv 文件并将比较结果写入一个新文件。文件 1 有 200k 行,文件 2 也可能有 200K 或更少。两者都有 200 列。文件没有排序,可以按任何顺序排列。我正在使用 Java 8 和 Spring 版本 4。
问题
我在我的项目中使用 Spring Batch,有什么方法可以使用 Spring Batch 自定义的 ItemReader 和 ItemWriter 来实现这一点,还是应该使用 tasklet,然后使用纯 Java 代码来比较文件?我也想以最快的方式做到这一点。数据量真的很大,可能是 2-4 Gigs,所以我不想将它加载到内存中。文件结构如下所示。
文件 1:
regn_nbr,name,address1,countrycode,regn_date
2345,John,4332 JFK Boulevard,US,02-12-2011
2347,mark,4332 Maryland Avenue,US,04-27-2015
2348,Smith,4332 JFK road,US,07-30-2011
2302,Andy,4332 JFK Lane,US,06-01-2010
文件 2:
regn_nbr,name,address1,countrycode,regn_date
2345,John,4332 JFK Boulevard,US,02-12-2011
2302,Andy,4332 JFK Lane,US,06-01-2010
2911,彼得,12 蜡烛驱动器,MX,01-01-2010
2348,Smith,4332 JFK road,US,07-30-2011
2347,mark,4332 Maryland Avenue,US,04-27-2015
我们非常欢迎您提出建议、不同的方法、策略和专业知识。
【问题讨论】:
-
Spring Batch 绝对是这个错误的选择。它适用于批处理,而您的问题至少需要在处理数据之前对数据进行排序。
-
@Kayaman。感谢您的回复。是的,它是一个批处理应用程序,我们已经经历了很多阶段,比如通过 FTP、数据库和各种来源以及大量业务处理来提取多个文件。我们整合了来自不同来源的数据并形成了这些文件。现在我们处于比较阶段。所以我的计划是对两个文件进行排序,在文件中插入缺少的记录键,然后将其传递给处理器以比较值。只是想知道没有排序我可以实现这种比较吗?
-
这样看吧。您从第一个文件中取出第一行,从第二个文件中取出第一行。第二个文件中的行与第一个文件中的行不对应。然后,您必须检查整个第二个文件以查看该行是否存在,或者它是否已被删除,这在批处理中实际上不起作用(也不会有效)。如果没有某种预处理,你就无法做到这一点。我会把它全部存入数据库。
-
这里也一样。将一个文件中的行插入到一个表中,将第二个文件中的行插入到另一个表中并执行
NOT EXISTSSELECT。
标签: java memory spring-integration spring-batch file-comparison