Apache NiFi evaluatejsonpath 处理器:连接 2 个属性的 JSONPath 表达式

Apache NiFi evaluatejsonpath processor: JSONPath expression to concatenate 2 attributes

我在 NiFi 中使用 EvaluateJsonPath 处理器来指定复合主键,以便将我的 JSON 数据写入 elasticsearch。我必须通过连接两个属性来创建一个名为 'key' 的属性,比方说 'attr1' 和 'attr2'。在 EvaluateJsonPath 配置中,我添加了一个值为 '${attr1}${attr2}' 的 属性 'key' (我使用这个键来避免 elasticsearch 中的冗余)。但是我收到如下错误:'key' 无效,因为指定的表达式无效:${attr1}${attr2}.

使用 EvaluateJsonPath 处理器连接 json 记录中的 2 个属性的正确语法是什么?

EvaluateJsonPath 需要一个 JSONPath 语句,在这种情况下,您似乎想要获取两个属性并使用 NiFi 表达式语言从中创建一个。如果是这样,那么 UpdateAttribute 应该就是您想要的。如果您希望将复合键插入到内容中,那么 UpdateRecord 应该就是您想要的。

我假设您将术语 attributes 与不同的上下文混淆了。当我第一次拿起 NiFi 并开始使用 JSON 时,我就这样做了。为了弄清楚,在这种特殊情况下有两种类型的属性:

  1. FlowFile 属性 - 这些属性有点像 FlowFile 的 metadata,例如 filenamefilesizemime.type 等。当您使用像 UpdateAttribute 这样的处理器添加属性时,它们会添加到 FlowFile 的元数据中,即 FlowFile 属性 not到 FlowFile 内容本身。
  2. JSON attributes - 这些是 FlowFile 内容中的字段。例如:Name 是这里的一个属性 -> { "Name" : "Smith, John"}

话虽如此,使用像 ${projectName}, ${filename} 这样的表达式是针对 FlowFile attributes 进行评估的。这种语法称为 NiFi 表达式语言。他们 不会 根据 FlowFile 的内容进行评估。 EvaluateJsonPath 采用 JSON 路径表达式,例如 $.Name

例如,假设您在 FlowFile 内容中有以下 JSON 文档:

{
    "attr1": "some value for attr1",
    "attr2": "some value for attr2"
}

在这种情况下,您必须使用如下所示的新属性配置 EvaluateJsonPath 处理器:

attribute1 : $.attr1
attribute2 : $.attr2

完成后,通过 EvaluateJsonPath 的流文件会将上述两个属性添加到 flowfile attributes 中,您可以使用 ${attribute1} 等 NiFi 表达式读取这些属性。然后将 EvaluateJsonPath 处理器连接到 UpdateRecord 处理器,您可以在 NiFi Expression Language 的帮助下将组合的复合密钥添加到 FlowFile JSON 内容中。

有用的链接