所以我有这样的avro记录(称为v1
):
record MyRecord {
array<string> keywords;
}
我想添加一个字段caseSensitive
,其默认值为false
(将其称为v2
)。我的第一种方法是:
record MyRecord {
array<string> keywords;
boolean caseSensitive = false;
}
根据schema evolution,这是向前和向后兼容的,因为具有新架构v2
的读者可以读取用旧的作家架构v1
编码的记录具有默认值的该字段和具有旧模式v1
的读取器将能够读取以新的写入者模式v2
编码的记录,因为它只会忽略新添加的字段。
添加此字段的另一种方法是添加union
类型的null
和boolean
,其默认值为null,例如:
record MyRecord {
array<string> keywords;
union{null, boolean} caseSensitive = null;
}
这也是向后和向前兼容的。我可以看到,如果某个字段没有明确的默认值(例如name
,address
等),有时会想使用第二种方法。但是考虑到我的用例具有明确的默认值,我正在考虑采用第一个解决方案。我的问题是:我在这里还缺少其他担忧吗?
答案 0 :(得分:0)
在第一种情况下,作者可能会遇到问题-显然,作者不使用默认值。因此,写“旧数据”的作者(缺少新字段,因此写者仅使用“关键字”字段发布记录)将与第一个模式发生冲突。使用第二个模式的同一编写者将成功,并且在结果消息中将“ caseSensitive”字段设置为null。