Как создать псевдоним поля Enum в схеме Avro - PullRequest
0 голосов
/ 01 марта 2020

Я хотел бы применить псевдонимы к развитому полю enum в моей схеме avro для обратной совместимости. Но после добавления псевдонимов в мое перечисление, реестр схемы все еще отклонял мою схему как несовместимую. Может кто-нибудь, пожалуйста, помогите увидеть, где я делаю неправильно? Я использую Avro 1.9.0

Исходная схема avro:

{
    "namespace": "com.example.test",
    "type": "record",
    "name": "Employee",
    "doc" : "testing schema",
    "fields": [
        {
            "name": "EmployeeId",
            "type": "string",
            "doc" : "Employee's Id"
        },
        {
            "name": "Type",
            "type": {
                "type": "enum",
                "name": "EmployeeType",
                "symbols": ["OFFICER", "MANAGER", "DIRECTOR"]
            }
        }
    ]
}

Что я сделал, чтобы развить схему, так это изменить ее пространство имен. Хотя содержимое схемы остается неизменным, перечисление, встроенное в схему Employee, неявно создается с новым пространством имен com.example.test.newnamespace. И это изменение привело к тому, что моя развитая схема стала обратно несовместимой.

Я попытался добавить псевдоним к развитому перечислению с новым пространством имен:

{
    "namespace": "com.example.test.newnamespace",
    "type": "record",
    "name": "Employee",
    "doc" : "testing schema",
    "fields": [
        {
            "name": "EmployeeId",
            "type": "string",
            "doc" : "Employee's Id"
        },
        {
            "name": "Type",
            "type": {
                "type": "enum",
                "name": "EmployeeType",
                "aliases": ["com.example.test.EmployeeType"],
                "symbols": ["OFFICER", "MANAGER", "DIRECTOR"]
            }
        }
    ]
}

Но когда я проверяю развитую схему с API моего реестра схем вернул реестр is-compatible = false.

Если я явно установлю полное квалифицированное имя моего перечисления таким же, как старое пространство имен "name": "com.example.test.EmployeeType", развитая схема совместима.

Где я делаю не так? Я вижу, что спецификация Avro заявляет, что поля enum поддерживают псевдонимы:

Enums Enums используют имя типа "enum" и поддерживают следующие атрибуты:

  • name: a JSON строка, содержащая имя перечисления (обязательно).
  • пространство имен, строка JSON, которая определяет имя;
  • псевдонимы: массив строк JSON с альтернативными именами для этого перечисления (необязательно).

... ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...