Avro模式:添加具有默认值的新字段-直接默认值还是具有null的并集?

时间:2018-11-20 22:18:06

标签: avro backwards-compatibility

所以我有这样的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类型的nullboolean,其默认值为null,例如:

record MyRecord {
    array<string> keywords;
    union{null, boolean} caseSensitive = null;
}

这也是向后和向前兼容的。我可以看到,如果某个字段没有明确的默认值(例如nameaddress等),有时会想使用第二种方法。但是考虑到我的用例具有明确的默认值,我正在考虑采用第一个解决方案。我的问题是:我在这里还缺少其他担忧吗?

1 个答案:

答案 0 :(得分:0)

在第一种情况下,作者可能会遇到问题-显然,作者不使用默认值。因此,写“旧数据”的作者(缺少新字段,因此写者仅使用“关键字”字段发布记录)将与第一个模式发生冲突。使用第二个模式的同一编写者将成功,并且在结果消息中将“ caseSensitive”字段设置为null。