首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当属性匹配时,如何使用Python序列化Avro中的联合字段

当属性匹配时,如何使用Python序列化Avro中的联合字段
EN

Stack Overflow用户
提问于 2018-01-25 20:09:16
回答 1查看 764关注 0票数 6

假设您有一个简化的AVDL示例:

代码语言:javascript
复制
@namespace("example.avro")
protocol User {
   record Man {
      int age;
   }

   record Woman {
      int age;
   }

   record User {
      union {
        Man,
        Woman
      } user_info;
   }
}

在python中,您无法正确序列化声明类型的对象,因为以下语法是不允许的:

代码语言:javascript
复制
{"user_info": {"Woman": {"age": 18}}}

唯一序列化的对象是

代码语言:javascript
复制
{"user_info": {"age": 18}}

丢失所有类型信息,并且DatumWriter通常选择与字段集匹配的第一条记录,在本例中为Man

在使用Java API时,上述问题可以很好地解决。

那么,我到底做错了什么呢?在Python的Avro实现中,序列化和反序列化是否可能不是幂等的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-19 03:56:40

您说得对,在这种情况下,标准avro库无法指定使用哪种模式。然而,fastavro (另一种实现)确实有办法做到这一点。在该实现中,可以将记录指定为元组,其中第一个值是模式名称,第二个值是实际记录数据。记录将如下所示:

{"user_info": ("Woman", {"age": 18})}

下面是示例脚本:

代码语言:javascript
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48442534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档