使用NiFi确定Oracle INSERT或UPDATE的最佳方法

时间:2017-06-06 21:53:53

标签: apache-nifi

我有一个JSON流文件,我需要确定是否应该进行INSERT或UPDATE。诀窍是只更新与JSON属性匹配的列。我有一个ExecuteSQL工作,它返回executionql.row.count,但是我丢失了原来的JSON流文件,我计划将其用作routeonattribute。我试图让MergeContent与JSON流一起加入ExecuteSQL(转储Avro输出,我只需要executionql.row.count属性)。我在执行ExecuteSQL之前已经设置了以下内容:

fragment.count = 2

fragment.identifier = $ {UUID()}

fragment.index = $ {nextInt()}

或者我可以创建一个MERGE,如果有办法循环遍历与Oracle表匹配的JSON属性列表?

1 个答案:

答案 0 :(得分:3)

你的JSON有多大?如果它很小,您可以考虑使用ExtractText(匹配整个文档)将JSON转换为属性。然后,您可以运行ExecuteSQL,然后使用ReplaceText将JSON放回内容中(覆盖Avro结果)。如果您的JSON很大,您可以设置DistributedMapCacheServer和(在单独的流程中)运行ExecuteSQL并将值或executionql.row.count存储到缓存中。然后在JSON流程中,您可以使用FetchDistributedMapCache和"将缓存值放入属性"物业集。

如果您只需要JSON来使用RouteOnAttribute,也许您可​​以在ExecuteSQL之前使用EvaluateJsonPath,因此您的条件已经在属性中,您可以替换流文件内容。

如果你想使用MergeContent,你可以将fragment.count设置为2,但是你可以设置" parent.identifier"而不是使用UUID()函数。到" $ {uuid}"使用UpdateAttribute,然后DuplicateFlowFile创建2个副本,然后使用UpdateAttribute设置" fragment.identifier"到" $ {parent.identifier}"和" fragment.index" to" $ {nextInt():mod(2)}"。这给出了一个可合并的两个流文件集,您可以在fragment.index为0或1时路由,向ExecuteSQL发送一个,在另一个流中发送一个,在MergeContent上加入备份。

另一种方法是使用ConvertJSONToSQL设置为" UPDATE",如果失败,将这些流文件路由到设置为" INSERT"的另一个ConvertJSONToSQL处理器。 p>