【问题标题】:Apache Nifi EvaluateJsonPath with Multiple Inputs具有多个输入的 Apache Nifi EvaluateJsonPath
【发布时间】:2019-03-08 14:25:07
【问题描述】:

我有 JSON 对象通过 MQTT 从两个不同的输入进入 Nifi - 例如,假设一个来自顶部传感器,一个来自底部传感器。每个传感器都有自己的 MQTT 主题,因此我使用两个不同的 ConsumeMQTT 处理器将这些数据摄取到我的 Nifi Flow 中。

JSON 对象 顶部传感器为 {"Top_Data": "value"}

JSON 对象 用于底部传感器是 {"Bottom_Data": "value"}

我目前正在使用两个单独的 EvaluateJsonPath 处理器将 Top_DataBottom_Data 的值存储在名为 sensorData 的属性中。

我如何使用某种 if/or 语句仅使用一个处理器来评估我可以从 MQTT 获得的两个 JSON 对象的 JsonPath?基本上,我想要一个表达式,说“如果我的 JSON 对象有一个名为 Top_Data 的属性,则将其值用于属性 sensorData,否则,使用属性 Bottom_Data 中的值。”

Example of my EvaluateJsonPath Processor

【问题讨论】:

    标签: apache-nifi json-path-expression


    【解决方案1】:

    也许可以试试 JSONPath 表达式

    $[Top_Data,Bottom_Data]
    

    在单个EvaluateJSONPathProcessor 中。 根据https://goessner.net/articles/JsonPath/,有可能使用备用运算符[,]

    [,] XPath 中的联合运算符导致节点集的组合。 JSONPath 允许将备用名称或数组索引作为一组。

    我已经使用http://jsonpath.com/ 测试了表达式,它应该可以工作。

    如果有帮助,请告诉我们。

    【讨论】:

    • 这行不通。如果在联合运算符中找不到任何元素,则将 FlowFile 转移到umatched 关系而不提取所需数据。
    【解决方案2】:

    您可以尝试使用 EvaluateJsonPath(property 1: top: $['top'], property 2: bottom: $['bottom']) 提取它们,当然不要忘记将 Destination 设置为 flowfile-attribute

    然后,转移到UpdateAttribute并将属性finalData设置为${top:isEmpty():ifElse(${bottom}, ${top})}

    如果EvaluateJsonPath 找不到完整的元素,则将其设置为空字符串,因此您需要做的就是检查其中一个是否为空,如果是,则将最终数据设置为另一个一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多