我正在使用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
...
如果我将货币字段的类型替换为联合["string", "null"]
,则数据将被序列化,但货币为null。
因此似乎根本没有考虑“默认”值。
我想念什么?默认值是否适用于基本类型?
预先感谢
答案 0 :(得分:2)
default: A default value for this field, used when reading instances that lack this field (optional)
当您尝试读取使用一种模式编写的实例并将其转换为使用另一种模式编写的实例时,将使用“默认值”字段。如果第一个架构中不存在该字段(因此实例缺少此字段),则您获得的实例将采用第二个架构的默认值。
不是吗!
使用相同模式读取/写入实例时,未使用“默认值” 。
因此,对于您的示例,当您将货币字段设置为默认值时,如果您尝试读取使用旧模式编写的不包含货币字段的实例,则您获得的实例将包含您的默认值已在您的架构中定义。
值得一提的是,当使用联合时,默认值仅指联合的第一种类型。