首页 > 解决方案 > 如何在 avro 模式中向嵌套映射添加新类型时保持 FULL_TRANSITIVE 兼容性?

问题描述

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

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

我试图在文件中重新定义类型map<map<RecordA>> mapsmap<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" : { }
}

最终目标是为具有可以是 a或的字段的记录提供 a mapof s 。原始模式已注册到模式注册表,其中字段的类型为 no with或默认值,因此我认为映射需要映射到具有任一版本字段的类型联合。mapstringarray<string>stringunion {}null

每次尝试都从模式注册表兼容性 API 返回以下内容

{
    "is_compatible": false
}

任何见解将不胜感激!

标签: compatibilityavroconfluent-schema-registry

解决方案


推荐阅读