NiFi UpdateRecord не будет обновлять вложенные поля - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь использовать UpdateRecord для замены значения вложенного поля. Я почти уверен, что правильно следую документации , но я могу только обновлять значения полей верхнего уровня, даже если // не работает должным образом. У меня есть несколько конфигураций в моих настройках UpdateRecord ниже, но сработала только последняя, ​​которая обновила requestObject.

Я уверен, что моя схема верна, потому что я использовал ее для преобразования XML в JSON без проблем.

У меня есть следующее:

Входной XML-файл:

<request>
    <requestType>BULKRETRIEVE</requestType>
    <requestDomainType>ROI</requestDomainType>
    <systemName>SYSTEMTEST</systemName>
    <location>USA</location>    
    <userInformation>
        <userId>1313</userId>
        <firstName>Some</firstName> <!-- required -->
        <lastName>Guy</lastName> <!-- required -->
        <email>email@address.com</email> <!-- required if phone not included -->
        <phone></phone> <!-- required if email not included -->
    </userInformation>  
    <requestObject>
        <startDate>2019-01-01T00:00:00.000-05:00</startDate>
        <endDate>2019-01-31T00:00:00.000-05:00</endDate>
        <type>ROI</type>
    </requestObject>
</request>

Схема AVRO:

{
    "namespace": "com.organization.somethingspecific",
    "name": "request",
    "type": "record",
    "fields": [
      {"name": "requestType", "type": ["string","null"], "default": null},
      {"name": "requestDomainType", "type": ["string","null"], "default": null},
      {"name": "systemName", "type": ["string","null"], "default": null},
      {"name": "location", "type": ["string","null"], "default": null},
      {"name": "userInformation", "type": ["null", {
        "name": "userInformation", "type": "array", "items": {
          "name": "userInformation", "type": "record", "fields": [
            {"name": "userId", "type": ["string","null"], "default": null},
            {"name": "firstName", "type": ["string","null"], "default": null},
            {"name": "lastName", "type": ["string","null"], "default": null},
            {"name": "email", "type": ["string","null"], "default": null},
            {"name": "phone", "type": ["string","null"], "default": null}
          ]
        }
      }], "default": null},
      {"name": "requestObject", "type": ["null",{
        "name": "requestObject", "type": "array", "items": {
          "name": "requestObject", "type": "record", "fields": [
            {"name": "startDate", "type": ["string","null"], "default": null},
            {"name": "endDate", "type": ["string","null"], "default": null},
            {"name": "type", "type": ["string","null"], "default": null}
          ]
        }
      }], "default": null}
    ]
}

И мой процессор UpdateRecord настроен так: UpdateRecord

1 Ответ

1 голос
/ 22 апреля 2019

В вашей схеме поле requestObject является массивом, поэтому вы не можете указать что-то вроде / requestObject / startDate, поскольку оно не указывает, какой элемент в массиве нужно обновить.

Я думаю, вам следуетв состоянии сделать что-то вроде / requestObject [*] / startDate, в котором говорится об изменении поля startDate для всех записей в массиве requestObject.

Справочные документы:

https://nifi.apache.org/docs/nifi-docs/html/record-path-guide.html

https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.9.2/org.apache.nifi.processors.standard.UpdateRecord/additionalDetails.html

...