我正在使用Avro(使用python库)对一些数据进行序列化,并且我很难确定如何使“默认”值起作用。
我有这个架构:
{
"type": "record",
"fields":[
{"name": "amount", "type": "long"},
{"name": "currency", "type": "string", "default": "EUR"}
],
"name": "Monetary",
}
因此,据我所知,我可以传递金额而不输入货币,货币字段将采用“ EUR”值。但是,如果在编写时未传递“ currency”字段,则会收到错误消息avro.io.AvroTypeException: The datum { ... } is not an example of the schema xxx
...
如果我将currency字段的类型替换为union ["string", "null"]
,那么数据将被序列化,而currency为null。
因此,似乎根本没有考虑“默认”值。
我想念什么?默认值是否适用于基本类型?
提前致谢
这是avro规范的相关引用
default: A default value for this field, used when reading instances that lack this field (optional)
当您尝试读取使用一个模式编写的实例并将其转换为使用另一模式编写的实例时,将使用“默认值”字段。如果第一个模式中不存在该字段(因此实例缺少此字段),则您获得的实例将采用第二个模式的默认值。
没错!
当您使用相同的架构读取/写入实例时,不会使用“默认值” 。
因此,以您的示例为例,当您将货币字段设置为默认值时,如果您尝试读取使用旧模式编写的不包含货币字段的实例,则获取的实例将包含您在处定义的默认值您的架构。
值得一提的是,当使用联合时,默认值仅指联合的第一种类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句