Как использовать тип Avro в другом типе Avro, не определяя его снова?

Я определил тип Avro с именем "some.package.SourceMetadata" в файле json с именем commonSourceMetadata.avsc:

{
  "type": "record",
  "name": "SourceMetadata",
  "namespace": "some.package",
  "fields": [..]
}

и я пытаюсь использовать его в другом файле avsc, используя ключевое слово imports, которое я нашел в Apache Avro 1.7.3:

  "imports": ["commonSourceMetadata.avsc"],
  "fields": [
    {
      "name": "sourceMetadata",
      "type": "some.package.SourceMetadata"
    },

Я также пробовал:

  "fields": [
    {
      "name": "sourceMetadata",
      "imports": ["commonSourceMetadata.avsc"],
      "type": "some.package.SourceMetadata"
    },

Версия Apache Avro - это 1.9.

Тем не менее я получаю:

org.apache.avro.SchemaParseException: "some.package.SourceMetadata" is not a defined name. The type of the "sourceMetadata" field must be a defined name or a {"type": ...} expression.
    at org.apache.avro.Schema.parse(Schema.java:1637)

Мне также ясно, что он не учитывает imports или import, потому что я пытался импортировать несуществующий файл, и там нет никаких жалоб.

Как я могу сделать это defined name?

Мы используем Scala, SBT и плагин AvroHugger для создания классов случаев Scala из определений типов avsc Avro.


person NicuMarasoiu    schedule 23.06.2020    source источник


Ответы (1)


Формат схемы Avro (в формате JSON, обычно с расширением .avsc) определяется спецификация.

Avro формат IDL отличается от JSON синтаксис, знакомый разработчикам, пишущим протоколы RPC.

Ключевое слово import поддерживается только в IDL. Это сделано намеренно, поскольку совместное использование схемы (JSON) не должно требовать совместного использования файловой системы.

Похоже, AvroHugger предлагает два способа сделать то, что вы хотите:

  1. Просто включите все файлы avsc при создании классов дел, и AvroHugger должен разрешить проблему имена или
  2. Используйте формат IDL (также поддерживаемый AvroHugger), который разрешает ключевое слово import.
person Ryan Skraba    schedule 25.06.2020
comment
Это отличный ответ, но мне не совсем ясно, где следует вызывать метод сортировки в жизненном цикле компиляции и как подключиться на этапе генерации. С поддержкой/плагином maven avro речь идет о настройке импорта, понятная вещь, здесь я не уверен, где можно подключить сортировку и как (кроме вызова sortFiles) - person NicuMarasoiu; 25.06.2020
comment
Я включил все файлы avsc, но это не разрешило их. Я понимаю, что вы говорите об их сортировщике, но я не уверен, что он используется автоматически, и если нет, то как бы я мог его использовать без разветвления плагина AvroHugger.. - person NicuMarasoiu; 06.07.2020