Apache nifi 如何查找GenerateTableFetch创建的所有文件已被处理

Apache nifi 如何查找GenerateTableFetch创建的所有文件已被处理,apache-nifi,Apache Nifi,我们有一个流程,其中GenerateTableFetch从splitJson获取输入,该JSON将TableName、ColumnName作为参数。同时将多个表作为输入传递给GenerateTableFetch,下一个ExecuteSql执行查询 现在,我想在下一个处理器处理完一个表的所有文件后触发一个新进程(最后是PutFile) 如何找到为一个表创建的所有文件都已处理?您可能需要完成这项工作,在撰写本文时,有一个补丁正在审查中,我希望它能进入NiFi 1.9.0 编辑:同时添加潜在的解决方法

我们有一个流程,其中GenerateTableFetch从splitJson获取输入,该JSON将TableName、ColumnName作为参数。同时将多个表作为输入传递给GenerateTableFetch,下一个ExecuteSql执行查询

现在,我想在下一个处理器处理完一个表的所有文件后触发一个新进程(最后是PutFile)

如何找到为一个表创建的所有文件都已处理?

您可能需要完成这项工作,在撰写本文时,有一个补丁正在审查中,我希望它能进入NiFi 1.9.0

编辑:同时添加潜在的解决方法

如果您可以使用ListDatabaseTables而不是从JSON文件获取表名,那么您可以将
包含计数设置为
true
。然后,您将获得表名及其行数的属性。然后,您可以将计数除以GTF中
分区大小的值,这将给出获取的数量(我们称之为
X
)。然后通过名为“parent”的UpdateAttribute或其他内容添加属性,并将其设置为
${UUID()}
。将这些属性保留在进入GTF和ExecuteScript的流文件中,然后可以使用Wait/Notify等待,直到收到
X
流文件(将
目标信号计数设置为
${X}
),并使用
${parent}
作为
释放信号标识符

如果不能使用ListDatabaseTables,则可以在拆分JSON后使用ExecuteSQLRecord,您可以从${table.name}
执行类似于
SELECT COUNT(*)的操作。如果使用ExecuteSQL,则可能需要ConvertAvroToJSON;如果使用ExecuteSQLRecord,则需要使用JSONRecordSetWriter。然后可以使用EvaluateJsonPath从流文件内容中提取计数

一旦在属性中有了表名和行数,就可以继续上面概述的流程(即确定GTF将生成的流程文件的数量等)

您可能需要完成这一点,在撰写本文时,有一个补丁目前正在审查中,我希望它能进入NiFi 1.9.0

编辑:同时添加潜在的解决方法

如果您可以使用ListDatabaseTables而不是从JSON文件获取表名,那么您可以将
包含计数设置为
true
。然后,您将获得表名及其行数的属性。然后,您可以将计数除以GTF中
分区大小的值,这将给出获取的数量(我们称之为
X
)。然后通过名为“parent”的UpdateAttribute或其他内容添加属性,并将其设置为
${UUID()}
。将这些属性保留在进入GTF和ExecuteScript的流文件中,然后可以使用Wait/Notify等待,直到收到
X
流文件(将
目标信号计数设置为
${X}
),并使用
${parent}
作为
释放信号标识符

如果不能使用ListDatabaseTables,则可以在拆分JSON后使用ExecuteSQLRecord,您可以从${table.name}
执行类似于
SELECT COUNT(*)的操作。如果使用ExecuteSQL,则可能需要ConvertAvroToJSON;如果使用ExecuteSQLRecord,则需要使用JSONRecordSetWriter。然后可以使用EvaluateJsonPath从流文件内容中提取计数


一旦在属性中有了表名和行数,就可以继续上面概述的流程(即确定GTF将生成的流程文件的数量等)

嗨,Matt,当前版本中有什么方法可以实现这一点吗?刚刚更新了我的答案,包括可能的解决方法。嗨,Matt,当前版本中有什么方法可以实现这一点吗?刚刚更新了我的答案,包括可能的解决方法。