首页 > 解决方案 > 为什么不使用 avro 默认值?(使用 avro-python)

问题描述

我正在使用 Avro 序列化一些数据(使用 python 库),我很难弄清楚如何使“默认”值起作用。

我有这个架构:

{
    "type": "record",
    "fields":[
        {"name": "amount", "type": "long"},
        {"name": "currency", "type": "string", "default": "EUR"}
    ],
    "name": "Monetary",
}

据我了解,我可以传递一个金额而不传递货币,货币字段将采用“EUR”值。但是,如果我在编写时没有传递“货币”字段,我会收到错误消息avro.io.AvroTypeException: The datum { ... } is not an example of the schema xxx...

如果我将货币字段的类型替换为 union ["string", "null"],则数据将被序列化,但货币为空。

因此,似乎根本没有考虑“默认”值。

我错过了什么?默认值是否适用于原始类型?

提前致谢

标签: serializationavro

解决方案


这是来自avro规范的相关引用

 default: A default value for this field, used when reading instances that lack this field (optional)

当您尝试读取使用一种模式编写的实例并将其转换为使用另一种模式编写的实例时,将使用“默认值”字段。如果第一个模式中不存在该字段(因此实例缺少该字段),则您获得的实例将采用第二个模式的默认值。

不是这样!

当您使用相同的模式读取/写入实例时,不使用“默认值” 。

因此,对于您的示例,当您将货币字段设置为默认值时,如果您尝试读取使用不包含货币字段的旧模式编写的实例,您获得的实例将包含您在你的架构。

值得一提的是,在使用 union 时,默认值仅指 union 的第一种类型。


推荐阅读