如何在Apache NiFi的JoltTransforms中实现if-else条件?

huangapple go评论59阅读模式
英文:

How to implement if-else condition in JoltTransforms in Apache NiFi?

问题

我正在准备 jolt 规范,在其中我需要实现 if-else 条件,但我无法实现。请帮助我。

注意:

  1. 如果输入中包含 application-component-node 对象,则打印该对象并且丢弃 application-componentapplication(如果所有三个应用程序对象都出现在输入中)。
  2. 如果输入中包含 application-component 对象,则打印该对象并且丢弃 application 对象(如果输入中有两个应用程序对象数组)。
  3. 如果输入中仅包含 application 对象,则打印该对象。

例如:

[
  {
    "severity": "ERROR",
    "type": "POLICY_CONTINUES_CRITICAL",
    "affectedEntities": [
      {
        "entityType": "POLICY",
        "name": "Exception Per Minute",
        "entityId": 3683
      },
      {
        "entityType": "APPLICATION",
        "name": "Teashop",
        "entityId": 6026
      },
      {
        "entityType": "APPLICATION-Component",
        "name": "Teashop",
        "entityId": 602667
      }
    ],
    "subType": "OVERALL_APPLICATION",
    "id": 92876278,
    "triggeredEntity": null
  }
]

预期输出:

[
  {
    "severity": "ERROR",
    "type": "POLICY_CONTINUES_CRITICAL",
    "affectedEntities": [
      {
        "entityType": "APPLICATION-Component",
        "name": "Teashop",
        "entityId": 602667
      }
    ],
    "subType": "OVERALL_APPLICATION",
    "id": 92876278,
    "triggeredEntity": null
  }
]

在这里,预期输出是 application-component-node,并且丢弃其他两个应用程序对象数组。

三个对象数组的优先级如下:

  • 优先级 1 是 application-component-node
  • 优先级 2 是 application-component
  • 优先级 3 是 application

注意:三个对象数组是动态的,有时只会出现两个对象数组,有时只会出现一个对象数组。

英文:

I am preparing the jolt specification where I need to implement if-else condition but I am unable to achieve it. Please help me out.

Note :

  1. if application-component-node object is coming in the input,
    then print that and drop application-component and application(if all three application object coming input).
  2. if application-component object is coming in the input, then
    print that and drop application object (if all two
    application object arrays coming input).
  3. if application object is only coming in the input, then print
    that.

For Example:

[
  {
    "severity": "ERROR",
    "type": "POLICY_CONTINUES_CRITICAL",
    "affectedEntities": [
      {
        "entityType": "POLICY",
        "name": "Exception Per Minute",
        "entityId": 3683
      },
      {
        "entityType": "APPLICATION",
        "name": "Teashop",
        "entityId": 6026
      },
      {
        "entityType": "APPLICATION-Component",
        "name": "Teashop",
        "entityId": 602667
      }
    ],
    "subType": "OVERALL_APPLICATION",
    "id": 92876278,
    "triggeredEntity": null
  }
]

Expected output:

[
  {
    "severity": "ERROR",
    "type": "POLICY_CONTINUES_CRITICAL",
    "affectedEntities": [
      {
        "entityType": "APPLICATION-Component",
        "name": "Teashop",
        "entityId": 602667
      }
    ],
    "subType": "OVERALL_APPLICATION",
    "id": 92876278,
    "triggeredEntity": null
  }
]

Here the expected output is application-component-node and drop the other two application object arrays

The priority among three object arrays is as follows:

  • Priority 1 is for application-component-node and,
  • Priority 2 is for application-component and,
  • Priority 3 is for application

Note : Three object arrays are dynamic and they might come sometime only two object arrays come and sometimes only one object array may come.

答案1

得分: 1

你可以在modify规范中使用一个名为lastElement的函数,例如:

[
  {
    "operation": "sort"
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "others.&",
        "app*": {
          "@": "app[].&"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "app": "=lastElement(@(1,&))"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[0].&"
      }
    }
  }
]

编辑:你还可以根据你最后的编辑,在modify规范中使用名为firstElement的函数,采用以下变换:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&",
        "aff*": {
          "*": {
            "*": "&2.@(1,entityType).&" // 使用 entityType 键重建子对象
          }
        }
      }
    }
  },
  { // 用于排序目的
    "operation": "shift",
    "spec": {
      "*": "&",
      "affectedEntities": {
        "APPLICATION-Component-Node": "&1[]",
        "APPLICATION-Component": "&1[]",
        "APPLICATION": "&1[]",
        "POLICY": "&1[]"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "aff*": "=firstElement(@(1,&))"
    }
  }
]

在最后的shift变换中,列表用于按给定的实体类型按其呈现的大小写进行排序。

在网站http://jolt-demo.appspot.com/上的demo如下:

如何在Apache NiFi的JoltTransforms中实现if-else条件?

英文:

You can use a lastElement function in a modify spec such as

[
  {
    "operation": "sort"
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "others.&",
        "app*": {
          "@": "app[].&"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "app": "=lastElement(@(1,&))"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[0].&"
      }
    }
  }
]

Edit : You can alternatively use the following transformation with
firstElement function in a modify spec based on your last edit :

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&",
        "aff*": {
          "*": {
            "*": "&2.@(1,entityType).&" // reconstruct subobjects with entityType keys
          }
        }
      }
    }
  },
  { // used for sorting purposes
    "operation": "shift",
    "spec": {
      "*": "&",
      "affectedEntities": {
        "APPLICATION-Component-Node": "&1[]",
        "APPLICATION-Component": "&1[]",
        "APPLICATION": "&1[]",
        "POLICY": "&1[]"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "aff*": "=firstElement(@(1,&))"
    }
  }
]

where the case-sensitivity of the entityTypes matter. The listing within the last shift transformation is used to order by those given entity types as in their presented letter cases.

the demo on the site http://jolt-demo.appspot.com/ is :

如何在Apache NiFi的JoltTransforms中实现if-else条件?

huangapple
  • 本文由 发表于 2023年6月16日 00:21:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/76483675.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定