我在NiFi中使用EvalateJsonPath处理器来指定一个复合主键,用于将我的JSON数据写入elasticsearch。我必须通过连接两个属性来创建一个名为“key”的属性,例如“attr1”和“attr2”。在EvalateJsonPath配置中,我添加了一个值为“${attr1}${attr2}”的属性“key”(我使用这个键来避免elasticsearch中的冗余)。但是我得到了一个错误:“key”无效,因为指定的表达式无效:${attr1}${attr2}。
使用EvalateJsonPath处理器连接json记录中的2个属性的正确语法是什么?
我假设您将术语属性
与不同的上下文混合在一起。当我第一次拿起NiFi并开始使用JSON时,我就这样做了。为了澄清问题,在这个特定的情况下有两种类型的属性:
filename
,filesize
,mime. type
等。当您使用诸如UpdateAt的处理器添加属性时,它们会被添加到FlowFile的元数据中,即FlowFile属性不会添加到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内容中。
有用的链接
EvalateJsonPath需要一个JSONPath语句,在这种情况下,您似乎想要获取两个属性并使用NiFi表达式语言从中创建一个。如果是这种情况,那么UpdateAt的属性应该是您想要的。如果您希望将复合键插入到内容中,那么UpdateRecords应该是您想要的。