为什么不使用 avro 默认值?(使用 avro-python)

Ein*_*din 3 serialization avro

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

我有这个架构:

{
    "type": "record",
    "fields":[
        {"name": "amount", "type": "long"},
        {"name": "currency", "type": "string", "default": "EUR"}
    ],
    "name": "Monetary",
}
Run Code Online (Sandbox Code Playgroud)

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

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

所以看来“默认”值根本没有被考虑在内。

我缺少什么?默认值适用于原始类型吗?

提前致谢

Eli*_*luf 5

这是avro 规范的相关引用

 default: A default value for this field, used when reading instances that lack this field (optional)
Run Code Online (Sandbox Code Playgroud)

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

不是这样的!

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

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

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