Написание AVRO фиксированного типа из JSON в NIFI - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь преобразовать файл потока NiFi, содержащий JSON, в запись AVRO.

У меня проблема в том, что я не знаю, как обращаться с фиксированным типом в AVRO, т.е. какуказать правильный JSON для преобразования в фиксированный?

В настоящее время я использую процессор ConvertJsonToAvro. Схема вывода AVRO:

{
  "type" : "record",
  "name" : "Message",
  "namespace" : "com.example",
  "fields" : [ {
    "name" : "MAC",
    "type" : {
      "type" : "fixed",
      "name" : "MY_FIXED_TYPE",
      "size" : 6
    }
  }]
}

JSON-формы ввода, которые я пробовал:

{ "MAC": [ 0, 1, 2, 3, 4, 5] }

{ "MAC": "012345" }

{"MAC":"\u0000\u0001\u0002\u0003\u0004\u0005"}

{"MAC":{"MY_FIXED_TYPE": "\u0000\u0001\u0002\u0003\u0004\u0005"}}

К сожалению, ни одна из них не сработала для меня. Я также попробовал ConvertRecord-процессор вместо ConvertJsonToAvro-процессора. Тоже без удачи.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

После дальнейших исследований похоже, что процессор ConvertJsonToAvro не может использоваться для генерации данных Avro FIXED или BYTES. Вероятно, это ошибка с NiFi и то, как процессор использует Avro.

Если я не ошибаюсь:

  1. NiFi ConvertJsonToAvro использует KiteSDK для интерпретации JSON в данные Avro. Это преобразование JSON в Avro не совпадает с кодировкой Avro JSON из спецификации.
  2. Этот процессор считывает входящую строку в jackson JsonNode .
  3. FIXED и BYTES типы должны соответствовать JsonNode, где isBinary() равно true .
  4. Насколько я могу судить, анализ строки JSON с Джексоном никогда не генерирует такой узел JSON.

Я бы поднял NiFi JIRA по этому поводу или проблему с KiteSDK.

0 голосов
/ 15 октября 2019

Примечание: этот ответ не относится к конвертации NiFi JSON в Avro. Приношу свои извинения за ошибочное предположение! Я не уверен в наилучшей практике для ответа, о котором известно, что он неправильный.

Приведен пример "правильной" кодировки Avro JSON для типа байтов в спецификации . Я думаю, что вы ищете:

{"MAC":"\u0000\u0001\u0002\u0003\u0004\u0005"}

Или в качестве альтернативы (для фиксированной схемы в объединении):

{"MAC":{"MY_FIXED_TYPE": "\u0000\u0001\u0002\u0003\u0004\u0005"}}

Вы можете правильно проанализировать эту входную строку, используя данную схему.

...