2
0
Fork 0
mirror of https://github.com/Vonng/ddia.git synced 2026-06-24 18:36:52 +08:00
This commit is contained in:
tankilo 2019-02-10 20:01:13 +08:00
parent 0812da1da6
commit 628667e16e

2
ch4.md
View file

@ -249,7 +249,7 @@ Avro的关键思想是作者的模式和读者的模式不必是相同的 - 他
为了保持兼容性,您只能添加或删除具有默认值的字段。 我们的Avro模式中的字段`favourNumber`的默认值为`null`)。例如,假设您添加一个默认值的字段,所以这个新的字段存在于新的模式中,而不是旧的。当使用新模式的阅读器读取使用旧模式写入的记录时,将为缺少的字段填充默认值。
如果你要添加一个没有默认值的字段新的阅读器将无法读取旧作者写的数据所以你会破坏向后兼容性。如果您要删除没有默认值的字段旧的阅读器将无法读取新作者写入的数据因此您会打破兼容性。在一些编程语言中null是任何变量可以接受的默认值但在Avro中并不是这样如果要允许一个字段为`null`,则必须使用联合类型。例如,`union {nulllongstring}`字段;表示该字段可以是数字或字符串,也可以是`null`。如果它是union的分支之一那么只能使用null作为默认值[^iv]。这比默认情况下可以为`null`是更加冗长的,但是通过明确什么可以和不可以是什么,有助于防止错误的`null` 【22】。
如果你要添加一个没有默认值的字段,新的阅读器将无法读取旧作者写的数据,所以你会破坏向后兼容性。如果您要删除没有默认值的字段,旧的阅读器将无法读取新作者写入的数据,因此您会打破向前兼容性。在一些编程语言中null是任何变量可以接受的默认值但在Avro中并不是这样如果要允许一个字段为`null`,则必须使用联合类型。例如,`union {nulllongstring}`字段;表示该字段可以是数字或字符串,也可以是`null`。如果它是union的分支之一那么只能使用null作为默认值[^iv]。这比默认情况下可以为`null`是更加冗长的,但是通过明确什么可以和不可以是什么,有助于防止错误的`null` 【22】。
[^iv]: 确切地说默认值必须是联合的第一个分支的类型尽管这是Avro的特定限制而不是联合类型的一般特征。