Это вопрос о преобразовании nifi jolt для группировки массивов json на основе ключевого атрибута в новый массив

#json #transform #apache-nifi #jolt

#json #трансформировать #apache-nifi #толчок

Вопрос:

Я новичок в преобразовании JOLT, я пытаюсь сгруппировать следующие объекты массива JSON на основе ACCOUNTNUMBER и ZIP , а затем объединить остальные атрибуты в соответствующие роли с помощью преобразования JOLT. Пожалуйста, помогите мне в написании спецификации JOLT для группировки объектов JSON, чтобы получить результат, приведенный ниже.

ВХОДНЫЕ ДАННЫЕ:

 [
  {
    "ClientCode": "1234567",
    "Relationships": [
      {
        "ENTITYID": 35056,
        "COUNTYCODE": 19,
        "ACCOUNTNUMBER": "1803",
        "ROLETYPE": "Payer",
        "ROLESEQNUM": 1,
        "ZIP": 55111
      },
      {
        "ENTITYID": 35056,
        "COUNTYCODE": 19,
        "ACCOUNTNUMBER": "1803",
        "ROLETYPE": "Owner",
        "ROLESEQNUM": 1,
        "ZIP": 55111
      },
      {
        "ENTITYID": 35056,
        "COUNTYCODE": 19,
        "ACCOUNTNUMBER": "1803",
        "ROLETYPE": "Insured",
        "ROLESEQNUM": 1,
        "ZIP": 55111
      },
      {
        "ENTITYID": 35056,
        "COUNTYCODE": 19,
        "ACCOUNTNUMBER": "1538",
        "ROLETYPE": "Payer",
        "ROLESEQNUM": 1,
        "ZIP": 54333
      },
      {
        "ENTITYID": 35056,
        "COUNTYCODE": 19,
        "ACCOUNTNUMBER": "1538",
        "ROLETYPE": "Owner",
        "ROLESEQNUM": 1,
        "ZIP": 54333
      },
      {
        "ENTITYID": 35056,
        "COUNTYCODE": 19,
        "ACCOUNTNUMBER": "1538",
        "ROLETYPE": "Insured",
        "ROLESEQNUM": 1,
        "ZIP": 54333
      }
    ]
  }
]
 

ВЫХОДНОЙ СИГНАЛ:

 [
  {
    "ClientCode": "1249612",
    "Relationships": [
      {
        "ACCOUNTNUMBER": "1803",
        "ZIP": 55111,
        "roles": [
          {
            "ENTITYID": 35056,
            "COUNTYCODE": 19,
            "ROLETYPE": "Payer",
            "ROLESEQNUM": 1
          },
          {
            "ENTITYID": 35056,
            "COUNTYCODE": 19,
            "ROLETYPE": "Owner",
            "ROLESEQNUM": 1
          },
          {
            "ENTITYID": 35056,
            "COUNTYCODE": 19,
            "ROLETYPE": "Insured",
            "ROLESEQNUM": 1
          }
        ]
      },
      {
        "ACCOUNTNUMBER": "1538",
        "ZIP": 54333,
        "roles": [
          {
            "ENTITYID": 35056,
            "COUNTYCODE": 19,
            "ROLETYPE": "Payer",
            "ROLESEQNUM": 1
          },
          {
            "ENTITYID": 35056,
            "COUNTYCODE": 19,
            "ROLETYPE": "Owner",
            "ROLESEQNUM": 1
          },
          {
            "ENTITYID": 35056,
            "COUNTYCODE": 19,
            "ROLETYPE": "Insured",
            "ROLESEQNUM": 1
          }
        ]
      }
    ]
  }
]
 

Ответ №1:

Вы можете выяснить это с помощью следующего преобразования сдвига

 [
  {
    "operation": "shift",
    "spec": {
      "*": {
        "ClientCode": "ClientCode",
        "Relationships": {
          "*": {
            "ACCOUNTNUMBER": "amp;2.[amp;1].amp;",
            "ZIP": "amp;2.[amp;1].amp;",
            "*": "amp;2.[amp;1].roles[0].amp;"
          }
        }
      }
    }
  }
]
 

где ключи со звездочками используются для ввода всех подобъектов, а amp;2 s представляют ключ, указанный на два уровня выше текущей позиции (например. Relationships ), [amp;1] s объединяет один к одному элементы сформированных массивов, roles[0] s обозначает помещение остальных элементов, отличных от выбранных нами, в новый массив вызывается roles , а крайние правые амперсанды представляют самые внутренние пары ключ-значение.