当属性匹配时,如何使用 Python 序列化 Avro 中的联合字段
How do you serialize a union field in Avro using Python when attributes match
假设您有这个 AVDL 作为简化示例:
@namespace("example.avro")
protocol User {
record Man {
int age;
}
record Woman {
int age;
}
record User {
union {
Man,
Woman
} user_info;
}
}
在 python 中,您无法正确序列化说明类型的对象,因为不允许使用此语法:
{"user_info": {"Woman": {"age": 18}}}
唯一被序列化的对象是
{"user_info": {"age": 18}}
丢失所有类型信息并且 DatumWriter
通常选择与字段集匹配的第一条记录,在本例中为 Man
.
上述问题在使用 Java API 时非常有效。
那么,我做错了什么? Python 的 Avro 实现中序列化和反序列化是否可能不是幂等的?
你说得对,标准 avro 库无法指定在这种情况下使用哪个模式。但是,fastavro
(另一种实现)确实有办法做到这一点。在该实现中,可以将记录指定为元组,其中第一个值是模式名称,第二个值是实际记录数据。记录将如下所示:
{"user_info": ("Woman", {"age": 18})}
这是示例脚本:
from io import BytesIO
from fastavro import writer
schema = {
"type": "record",
"name": "User",
"fields": [{
"name": "user_info",
"type": [
{
"type": "record",
"name": "Man",
"fields": [{
"name": "age",
"type": "int"
}]
},
{
"type": "record",
"name": "Woman",
"fields": [{
"name": "age",
"type": "int"
}]
}
]
}]
}
records = [{"user_info": ("Woman", {"age": 18})}]
bio = BytesIO()
writer(bio, schema, records)
假设您有这个 AVDL 作为简化示例:
@namespace("example.avro")
protocol User {
record Man {
int age;
}
record Woman {
int age;
}
record User {
union {
Man,
Woman
} user_info;
}
}
在 python 中,您无法正确序列化说明类型的对象,因为不允许使用此语法:
{"user_info": {"Woman": {"age": 18}}}
唯一被序列化的对象是
{"user_info": {"age": 18}}
丢失所有类型信息并且 DatumWriter
通常选择与字段集匹配的第一条记录,在本例中为 Man
.
上述问题在使用 Java API 时非常有效。
那么,我做错了什么? Python 的 Avro 实现中序列化和反序列化是否可能不是幂等的?
你说得对,标准 avro 库无法指定在这种情况下使用哪个模式。但是,fastavro
(另一种实现)确实有办法做到这一点。在该实现中,可以将记录指定为元组,其中第一个值是模式名称,第二个值是实际记录数据。记录将如下所示:
{"user_info": ("Woman", {"age": 18})}
这是示例脚本:
from io import BytesIO
from fastavro import writer
schema = {
"type": "record",
"name": "User",
"fields": [{
"name": "user_info",
"type": [
{
"type": "record",
"name": "Man",
"fields": [{
"name": "age",
"type": "int"
}]
},
{
"type": "record",
"name": "Woman",
"fields": [{
"name": "age",
"type": "int"
}]
}
]
}]
}
records = [{"user_info": ("Woman", {"age": 18})}]
bio = BytesIO()
writer(bio, schema, records)