【问题标题】:Apache NiFi evaluatejsonpath processor: JSONPath expression to concatenate 2 attributesApache NiFi评估jsonpath处理器:连接2个属性的JSONPath表达式
【发布时间】:2018-08-13 10:40:09
【问题描述】:

我在 NiFi 中使用 EvaluateJsonPath 处理器来指定一个复合主键,用于将我的 JSON 数据写入弹性搜索。我必须通过连接两个属性来创建一个名为“key”的属性,比如说“attr1”和“attr2”。在 EvaluateJsonPath 配置中,我添加了一个值为 '${attr1}${attr2}' 的属性 'key'(我使用这个键来避免弹性搜索中的冗余)。但是我收到一个错误,例如:'key' is invalid because specified expression was not valid: ${attr1}${attr2}.

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

【问题讨论】:

    标签: apache-nifi json-path-expression


    【解决方案1】:

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

    1. FlowFile 属性 - 这些属性有点像 FlowFile 的元数据,例如 filenamefilesizemime.type 等。当您添加属性使用像UpdateAttribute 这样的处理器,它们被添加到流文件的元数据中,即流文件属性到流文件内容本身。
    2. JSON 属性 - 这些是 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 内容中。

    有用的链接

    【讨论】:

    • 感谢您的回答。它为我解决了这个问题。我使用 EvaluateJsonPath 处理器创建了 2 个流文件属性(在配置中设置目标 ='流文件属性'),其值与流文件内容中存在的 attr1 和 attr2 相同。然后使用 UpdateAttribute 处理器,我创建了另一个流文件属性 key = ${attr1}${attr2} (与 ${attr1}:${attr2} 等特殊字符连接也可以)。我在 PutElasticsearchHttp 处理器中使用这个键作为主键(使用 index='upsert' )。再次感谢您的帮助:)
    • 我们能否将两个 Json 属性合并为一个(在 EvaluateJsonPath 中)?喜欢attribute3 : $.attr1+$.attr2
    【解决方案2】:

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

    【讨论】:

    • 我不希望将新属性添加到记录中。正如您所建议的,我正在使用 UpdateAttribute 并在其中添加了一个属性 'es_key',其值为 '${projectname}' 其中 projectname 是我拥有的每条 JSON 记录中存在的一个属性。但是 UpdateAttribute 之后的 PutElasticsearchHttp 不会向索引写入任何内容。
    • Matt 的意思是 UpdateAttribute 将使用 EL 构建您想要的密钥并将其作为 attribute 存储在流文件中,而无需修改 content 的记录。如果attr1attr2 两个属性都派生自JSON 内容,那么您需要EvaluateJsonPath 处理器首先 将JSON 值提取到属性中,然后使用UpdateAttribute 将它们组合起来.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多