serialization - 为什么不使用 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"]
,则数据将被序列化,但货币为空。
因此,似乎根本没有考虑“默认”值。
我错过了什么?默认值是否适用于原始类型?
提前致谢
解决方案
这是来自avro规范的相关引用
default: A default value for this field, used when reading instances that lack this field (optional)
当您尝试读取使用一种模式编写的实例并将其转换为使用另一种模式编写的实例时,将使用“默认值”字段。如果第一个模式中不存在该字段(因此实例缺少该字段),则您获得的实例将采用第二个模式的默认值。
不是这样!
当您使用相同的模式读取/写入实例时,不使用“默认值” 。
因此,对于您的示例,当您将货币字段设置为默认值时,如果您尝试读取使用不包含货币字段的旧模式编写的实例,您获得的实例将包含您在你的架构。
值得一提的是,在使用 union 时,默认值仅指 union 的第一种类型。
推荐阅读
- php - PHP 8 评论错误
- json - 我有一个提供一些文本数据的 api,但文本在 ListStyle 中不起作用
- node.js - 如何在没有节点的情况下运行基于 HTML 的 Web 组件?
- javascript - 如何将多个文件大小排列到单个 HTML 卡中?
- sql-server - 从 SQL Server 数据库向 FCM 推送通知
- python - Dealing with a corrupt/bugged pip installation in osx
- node.js - 如果属性具有特定值,有没有办法找到并返回它?
- python - 用户按下赞按钮时不会突出显示,也不会显示赞数 ..in django。你能建议我任何解决方案吗
- r - 卷曲错误:操作在 1000 毫秒后超时
- machine-learning - 关于每周监督学习的论文回顾