首页 > 解决方案 > NIFI 将大型 CSV 插入 SQL 数据库

问题描述

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

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

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

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

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

标签: csvapache-nifi

解决方案


您应该能够使用ValidateCsvValidateRecord来执行数据类型的内容和其他验证。检测大文件中的重复项很困难,因为您必须跟踪所看到的所有内容,这可能会占用大量内存。如果您有一列可用于检测重复项,请尝试在该列上使用唯一约束的 ValidateCsv,并将验证策略设置为逐行。这应该将所有有效行放在一起,以便之后您仍然可以使用 PutDatabaseRecord。

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


推荐阅读