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 时,我就这样做了。为了弄清楚,在这种特殊情况下有两种类型的属性:
- FlowFile 属性 - 这些属性有点像 FlowFile 的 metadata,例如
filename
,filesize
、mime.type
等。当您使用像 UpdateAttribute
这样的处理器添加属性时,它们会添加到 FlowFile 的元数据中,即 FlowFile 属性 not到 FlowFile 内容本身。
- 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 内容中。
有用的链接
- NiFi 表达式语言指南 - https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html
- EvaluateJsonPath 示例 - https://community.hortonworks.com/questions/106210/how-to-use-evaluate-json-path-in-nifi.html
- 更新记录 - https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.7.1/org.apache.nifi.processors.standard.UpdateRecord/additionalDetails.html
我在 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 时,我就这样做了。为了弄清楚,在这种特殊情况下有两种类型的属性:
- FlowFile 属性 - 这些属性有点像 FlowFile 的 metadata,例如
filename
,filesize
、mime.type
等。当您使用像UpdateAttribute
这样的处理器添加属性时,它们会添加到 FlowFile 的元数据中,即 FlowFile 属性 not到 FlowFile 内容本身。 - 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 内容中。
有用的链接
- NiFi 表达式语言指南 - https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html
- EvaluateJsonPath 示例 - https://community.hortonworks.com/questions/106210/how-to-use-evaluate-json-path-in-nifi.html
- 更新记录 - https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.7.1/org.apache.nifi.processors.standard.UpdateRecord/additionalDetails.html