提问者:小点点

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


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

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


共2个答案

匿名用户

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

  1. FlowFile属性-这些属性有点像FlowFile的元数据,如filenamefilesizemime. type等。当您使用诸如UpdateAt的处理器添加属性时,它们会被添加到FlowFile的元数据中,即FlowFile属性不会添加到FlowFile内容本身。
  2. JSON属性-这些是FlowFile内容中的字段。例如:Name是这里的一个属性-

话虽如此,使用像${project ectName}这样的表达式,${filename}会根据FlowFile属性进行计算。这种语法称为NiFi表达式语言。它们不会根据FlowFile的内容进行计算。EvalateJsonPath采用像$这样的JSON路径表达式。名称

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

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

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

attribute1 : $.attr1
attribute2 : $.attr2

完成后,通过EvalateJsonPath的流文件将在流文件属性中添加上述两个属性,您可以使用NiFi表达式(如${属性1})读取它们。然后将EvalateJsonPath处理器连接到UpdateRecords处理器,您可以在NiFi表达式语言的帮助下将组合的复合键添加到FlowFileJSON内容中。

有用的链接

  • NiFi表达式语言指南-https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html
  • 评估JsonPath样本-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

匿名用户

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