在将新类型添加到avro模式中的嵌套地图时,如何保持FULL_TRANSITIVE兼容性?

时间:2019-07-02 21:19:56

标签: compatibility avro confluent-schema-registry

我有一个现有的Avro模式,其中包含一个字段,该字段带有记录类型的映射的嵌套映射(现在将其称为RecordA)。我想知道是否有可能在保持FULL_TRANSIENT兼容性的同时向此嵌套地图映射添加新的记录类型RecordB?

我的想法是,只要内部映射默认为空映射,它仍会坚持该模式,因此它向后/向前兼容。

我尝试将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" : { }
}

最终目标是在一个记录中拥有mapmap,其中一个字段可以是stringarray<string>。原始架构已注册到架构注册机构,其中该字段的类型为string,而没有union {}null或默认值,因此我认为映射必须映射为类型与该字段的任一版本。

每次尝试都从架构注册表兼容性API中返回了以下内容

{
    "is_compatible": false
}

任何见识将不胜感激!

0 个答案:

没有答案