为什么不使用 avro 默认值? (使用 avro-python)
Why is the avro default value not used ? (with avro-python)
我正在使用 Avro 序列化一些数据(使用 python 库),我很难弄清楚如何使 "default" 值起作用。
我有这个架构:
{
"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"]
,则数据被序列化,但货币为空。
所以似乎根本没有考虑 "default" 值。
我错过了什么?默认值是否适用于基本类型?
提前致谢
的相关引用
default: A default value for this field, used when reading instances that lack this field (optional)
当您尝试读取使用一种模式编写的实例并将其转换为使用另一种模式编写的实例时,将使用 'default value' 字段。如果该字段在第一个模式中不存在(因此实例缺少该字段),您获得的实例将采用第二个模式的默认值。
就是这样!
'default value' 未使用 当您 read/write 使用 相同 架构的实例时。
因此,对于您的示例,当您将货币字段设置为默认值时,如果您尝试读取使用不包含货币字段的旧架构编写的实例,您获得的实例将包含默认值您已在架构中定义。
值得一提的是,当您使用联合时,默认值仅指联合的第一种类型。
我正在使用 Avro 序列化一些数据(使用 python 库),我很难弄清楚如何使 "default" 值起作用。
我有这个架构:
{
"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"]
,则数据被序列化,但货币为空。
所以似乎根本没有考虑 "default" 值。
我错过了什么?默认值是否适用于基本类型?
提前致谢
default: A default value for this field, used when reading instances that lack this field (optional)
当您尝试读取使用一种模式编写的实例并将其转换为使用另一种模式编写的实例时,将使用 'default value' 字段。如果该字段在第一个模式中不存在(因此实例缺少该字段),您获得的实例将采用第二个模式的默认值。
就是这样!
'default value' 未使用 当您 read/write 使用 相同 架构的实例时。
因此,对于您的示例,当您将货币字段设置为默认值时,如果您尝试读取使用不包含货币字段的旧架构编写的实例,您获得的实例将包含默认值您已在架构中定义。
值得一提的是,当您使用联合时,默认值仅指联合的第一种类型。