Python Avro向修改后schema写入数据报不符合schema错误如何解决?
Avro写入报错排查与多schema写入问题解答
报错原因与修复
你当前的报错是seating字段类型不匹配导致的:
你在schema中声明seating的类型是{"type": "map", "values": "int"},Avro的map类型在Python中对应的是单层级字典对象,但你代码中给seating赋的值是由多个字典组成的列表,不符合schema的类型约束,因此触发了类型校验报错。
修正方法很简单,把seating的赋值改成单字典即可:
data = { 'name': 'Foo', 'time': 25612345, 'location': 'Berne', 'speakers': ['Jean', 'Elton'], 'participants': ['John', 'Michel', 'Jacques'], # 修正后的seating字段 'seating': {'John': 1, 'Michel': 2, 'Jacques': 3} }
修改后重新运行即可正常写入数据。
新旧schema数据能否写入同一个Avro文件
不能直接写入。Avro文件的文件头仅会存储唯一的写入schema,同一文件内的所有记录都必须适配该schema,否则都会触发类型校验错误。
如果有需要合并存储新旧schema数据的需求,可选择以下两种方案:
- 按Avro schema演进规则定义新schema,保证新schema向前兼容旧schema(比如新增字段设置默认值,不删除、不修改原有字段的类型和名称),读取旧数据时通过
DatumReader(old_writer_schema, new_reader_schema)做自动类型转换,将旧数据适配为新schema格式后再统一写入新文件。 - 如果新旧schema差异过大无法兼容,建议将不同schema的记录分开存储到不同的Avro文件中,避免数据格式混乱。
内容的提问来源于stack exchange,提问作者J.erome
相关产品推荐
相关产品推荐

