putSql处理器后,executeSql失败

时间:2019-02-17 14:38:01

标签: mysql apache-nifi

我的用例是查询一组表的数据并将其插入一个表中。所以我的nifi处理器基本上是这样的:

  

executeSql(数据集的查询集)>>> convertAvrotoJson >>>> convetJSONtoSQL(转换为insert语句)>>>> putSQL(插入语句)>>> executeSQL(删除与set中的第一个处理器查询关联的行表格)

问题出在最后一个executeSQL处理器上,当它不执行我的sql时,它会继续尝试运行putSQL查询。

为了测试(我在executeSQL中),我只用普通选择替换了我的删除查询: enter image description here

这是executeSQL的数据来源,我们可以清楚地看到它仍然试图执行来自putSQL的insert语句,即使我已经指定要执行查询: enter image description here

这是错误,错误清楚地表明我明确不希望它执行插入语句时我没有提供参数:

enter image description here

在表A中成功插入记录后如何在表B上执行删除语句?请帮助,因为即时通讯卡在此。请不要与图像混淆,因为我只是使用常规select测试它,以确保nifi可以正确执行我的查询。 我正在使用mysql 5.7

1 个答案:

答案 0 :(得分:2)

如果流文件上有sql.args个属性,ExecuteSQL将尝试使用它们来用参数填充PreparedStatement。这是因为指定的查询(无论是通过流文件主体还是通过SQL select query属性进入)都可以具有?参数,以用流文件属性来填充。对于上述流程,您可以在PutSQL和ExecuteSQL之间放置一个UpdateAttribute处理器,将Delete Attributes Expression属性设置为sql\.args\..*或类似的东西,以删除参数。

话虽如此,我建议您将整个流程替换为ExecuteSQL-> PutDatabaseRecord-> ExecuteSQL。这将绕过转换逻辑,并且SQL生成/执行在内部完成(因此不需要sql.args属性)。