我有一个现有的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" : { }
}
最终目标是在一个记录中拥有map
个map
,其中一个字段可以是string
或array<string>
。原始架构已注册到架构注册机构,其中该字段的类型为string
,而没有union {}
和null
或默认值,因此我认为映射必须映射为类型与该字段的任一版本。
每次尝试都从架构注册表兼容性API中返回了以下内容
{
"is_compatible": false
}
任何见识将不胜感激!