我正在从SFTP站点读取CSV文件并使用Nifi将其加载到mysql数据库。
我有以下工作流程,似乎工作正常。在开始数据加载之前,我只需要帮助弄清楚如何截断表。
Nifi流程:
ListSFTP - > FetchSFTP - > InferAvroSchema - > ConvertCSVtoAvro - > ConvertAvrotoJSON - > SplitJSON - > ConvertJSONtoSQL - > PutSQL
这个流似乎工作正常,但每次运行时,我都需要先截断表,然后再开始加载。
有人可以帮我提供一些关于如何实现这一目标的信息。或者是否有比我写的更好的流程,请告知。
谢谢, Aadil
答案 0 :(得分:2)
在我进入"插入之前截断"部分,我建议将所有内容从ConvertCSVtoAvro替换为Put PutDatabaseRecord。它基本上是一个" ConvertXtoSQL-> PutSQL"在一起,并减少所有这些转换的需要只是为了执行SQL语句。
插入部分之前的截断有点棘手。从NiFi 1.5.0开始(在撰写本文时尚未发布)通过NIFI-4522,您将能够在执行SQL命令时保留流文件内容。这意味着在PutDatabaseRecord之前你可以让PutSQL使用" SQL语句"设置为" TRUNCATE myTable"。 PutSQL将发出TRUNCATE但是传递流文件。
目前我能想到的唯一解决方法是ExecuteScript处理器。如果使用PutDatabaseRecord,您可能必须按名称获取DBCPConnectionPool(有关示例,请参阅my blog post)并自行执行TRUNCATE语句,然后传入传入的流文件。如果使用PutSQL上面的流程,你可以得到传入的流文件,然后写出一个" TRUNCATE myTable"仅当fragment.index为零并且您在连接上使用Prioritizer时才传输流文件,然后传输传入的流文件。