compatibility - 如何在 avro 模式中向嵌套映射添加新类型时保持 FULL_TRANSITIVE 兼容性?
问题描述
我有一个现有的 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" : { }
}
最终目标是为具有可以是 a或的字段的记录提供 a map
of s 。原始模式已注册到模式注册表,其中字段的类型为 no with或默认值,因此我认为映射需要映射到具有任一版本字段的类型联合。map
string
array<string>
string
union {}
null
每次尝试都从模式注册表兼容性 API 返回以下内容
{
"is_compatible": false
}
任何见解将不胜感激!
解决方案
推荐阅读
- asp.net - 表单击的 asp.net 事件处理程序被调用两次
- python - 人物图片网格
- git - 如何从我的 oh-my-posh/posh-git 显示中删除红色基础字形?
- angular - 错误:使用“ngfor”时“找不到映射容器”
- chef-infra - chef 策略组设置:Policyfile 不支持在 json 数据中设置 run_list
- javascript - 使用 reducer 将嵌套的对象数组转换为键值对对象
- javascript - React Hook 查找用户
- javascript - JS 练习背景从白色到蓝色的切换
- python - RQ-dashboard 上报空时数据
- flutter - RefreshIndicator 不能将 SingleChildScrollView 用作子项