Как сохранить совместимость FULL_TRANSITIVE при добавлении новых типов во вложенную карту в схеме avro? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть существующая схема avro, которая содержит поле с вложенной картой карты типа записи (на данный момент назовем ее RecordA).Мне интересно, возможно ли добавить новый тип записи, RecordB, к этой вложенной карте карт при сохранении совместимости FULL_TRANSIENT?

Я думал, что до тех пор, пока внутренние карты по умолчанию переводятся в пустую карту, онивсе еще придерживается схемы, поэтому она обратно / вперед совместима.

Я пытался переопределить тип от map<map<RecordA>> maps до map<map<union{RecordA, RecordB}>> maps в файле .avdl, но реестр схемы говорит мне, что это несовместимо.

Я также пытался по умолчанию установить каждую карту отдельно для пустой карты ({ }) в сгенерированном файле .avsc, но в реестре схем также указано, что это несовместимо.

Я делаюхочу признать, что я знаю map<map<..>> - это плохая практика, но то, что было сделано, было сделано.

Зарегистрированная схема (оригинал) .avdl:

record Outer {
    map<map<RecordA>> maps;
}
record RecordA {
    string value;
    string updateTime;
}

Попыткас .avdl:

record Outer {
    map<map<union{RecordA, RecordB}>> maps = {};
}
record RecordA {
    string value;
    string updateTime;
}
record RecordB {
    union{null, array<string>} values = null;
    union{null, string} updateTime = null;
}

Попытка с .avsc:

{
            "name" : "maps",
            "type" : {
              "type" : "map",
              "values" : {
                "type" : "map",
                "values" : [ {
                  "type" : "record",
                  "name" : "RecordA",
                  "fields" : [ {
                    "name" : "value",
                    "type" : "string"
                  }, {
                    "name" : "updateTime",
                    "type" : "string"
                  } ],
                  "default": { }
                }, {
                  "type" : "record",
                  "name" : "RecordB",
                  "fields" : [ {
                    "name" : "value",
                    "type" : [ "null", "string" ],
                    "default" : null
                  }, {
                    "name" : "values",
                    "type" : [ "null", "string" ],
                    "default" : null
                  }, {
                    "name" : "updateTime",
                    "type" : [ "null", "string" ],
                    "default" : null
                  } ],
                  "default": { }
                } ]
              }
            },
            "default" : { }
}

Конечная цель - получить map из map sк записи, у которой есть поле, которое может быть либо string, либо array<string>.Исходная схема была зарегистрирована в реестре схем, где поле имеет тип string без union {} с null или значением по умолчанию, поэтому я считаю, что карта должна быть сопоставлена ​​с объединением типов с любой версиейfield.

Каждая попытка возвращала следующее из API совместимости реестра схемы

{
    "is_compatible": false
}

Любое понимание будет очень цениться!

...