Apache Nifi: анализ данных с помощью процессора UpdateRecord - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь проанализировать некоторые данные в Nifi (1.7.1) с помощью процессора UpdateRecord.Исходные данные - это файлы json, которые я хотел бы преобразовать в Avro на основе схемы.Преобразование Avro в порядке, но в этом преобразовании мне также нужно проанализировать один элемент массива из данных json в другую структуру в Avro.Это пример данных ввода json:

{  "geometry" : {
"coordinates" : [ [ 4.963087975800593, 45.76365595859971 ], [ 4.962874487781098, 45.76320922779652 ], [ 4.962815443439148, 45.763116079159374 ], [ 4.962744732112515, 45.763010484202866 ], [ 4.962096825239138, 45.762112721939246 ] ]}  ...}

Является его схемой (указанной в RecordReader):

{  "type": "record",
  "name": "features",
  "fields": [
    {
      "name": "geometry",
      "type": {
        "type": "record",
        "name": "geometry",
        "fields": [
          {
            "name": "coordinatesJson",
            "type": {
              "type": "array",
              "items": {
                "type": "array",
                "items": "double"
              }
            }
          },
        ]
      }
    },
    ....
  ]
} 

Как видите, координаты - это массив массивов.

И мне нужно проанализировать эти данные в Avro на основе этой схемы (указанной в RecordWriter):

{
  "name": "outputdata",
  "type": "record",
  "fields": [
    {"name": "coordinatesAvro",
      "type": {
        "type": "array",
        "items" : {
        "type" : "record",
        "name" : "coordinatesAvro",
        "fields" : [ {
          "name" : "X",
          "type" : "double"
        }, {
          "name" : "Y",
          "type" : "double"
        } ]
      }
      }
    },
    .....

  ]
}   

Проблема в том, что я не могу проанализировать координатыJson дляordinatesAvro, используя функции RecordPath Я попробовал несколько отображений, таких как:

Property:                            Value:
/coordinatesJson[0..-1]/X            /geometry/coordinatesAvro[*][0]
/coordinatesJson[0..-1]/Y            /geometry/coordinatesAvro[*][1]

Это должен быть довольно простой шаг разбора, но, как я уже сказал, я собирался кругами, чтобы достичь этого некоторое время.

Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 08 декабря 2018

Когда я сталкиваюсь с чем-то подобным, я делаю следующее: 1) Преобразуем Json в Json с помощью strcuture, который мне нужен (например, в вашем случае: argumentsAvro) с помощью обработчика ExecuteScript.Я использовал ECMAScript, потому что вы можете просто анализировать JSON и работать с объектами (преобразовать их).2) ConvertJsonToAvro с одной общей схемой (координат в вашем случае) для Reader и Writer.Это работает очень хорошо, и я использовал его в случаях BigData.Это одно из возможных решений вашей проблемы.

...