NIFI将大型CSV插入SQL数据库

时间:2018-09-04 14:18:14

标签: csv apache-nifi

我正在尝试将大量的CSV大文件插入数据库。 我正在使用PutDataBaseRecord处理器来执行此操作,这使此过程变得非常快速和容易。

问题是我不知道如何正确处理故障,例如如果值与列的数据类型不匹配,或者行重复。 如果发生这种情况,PutDataBaseRecord处理器将丢弃刚从CSV文件转换的该批次的所有记录。因此,如果一条2.000.000记录失败,则2.000.000记录都不会进入数据库。

我通过事先清理CSV数据设法解决了一个问题源,但仍然遇到重复行的问题。

我试图通过将CSV拆分为NIFI中的单行,然后再将它们传递到PutDatabaseRecord处理器中来解决此问题,这确实非常慢,并且经常会导致OOM错误。

有人可以建议在SQL数据库中插入大型CSV的另一种方法吗?

1 个答案:

答案 0 :(得分:3)

您应该能够使用ValidateCsvValidateRecord来进行数据类型的填充和其他验证。检测大型文件中的重复项非常困难,因为您必须跟踪所看到的所有内容,这会占用大量内存。如果您只有一列可用于检测重复项,请尝试对该列具有唯一性约束的ValidateCsv,并将“验证策略”设置为逐行。那应该将所有有效行保持在一起,以便您以后仍可以使用PutDatabaseRecord。

或者,您可以将CSV拆分为单行(至少使用两个SplitText或SplitRecord处理器,一个将流文件拆分为较小的块,然后第二个将较小的块拆分为单独的行),并使用DetectDuplicate来删除重复的行。那时,您可能想要使用MergeContent或MergeRecord之类的东西来捆绑备份的行,以便PutDatabaseRecord更有效地使用