Avro Schema字段配置的aliases别名未生效问题咨询
问题原因
Avro 字段别名aliases的设计定位是Schema 进化兼容场景下的跨Schema映射规则,而非写入时的同Schema字段自动别名匹配,你当前场景下别名不生效的根因有两个:
- 你写入和读取数据时使用的是完全相同的Schema,fastavro默认逻辑下,
writer只会严格匹配字段的name属性,不会主动扫描aliases列表匹配输入数据的字段名,所以输入数据里的title字段会被直接忽略,name字段因为没有传入有效值且允许为null,就被默认写入了null,读取时自然返回null。 aliases的生效场景是:你用旧Schema(字段名为title)写入了Avro文件,后续迭代出了新Schema(字段改为name且配置了aliases: ["title"]),此时用新Schema读取旧Schema生成的Avro文件,别名会自动完成title到name的映射。
解决方法
你可以通过两种方式实现需求:
方法1:开启fastavro的别名处理参数
fastavro 0.24.0及以上版本提供了handle_aliases参数,开启后写入阶段就会自动匹配字段别名,修改你的写入代码即可:
with open(avro_data, 'wb') as fout: writer(fout, schema, data, validator=True, handle_aliases=True)
修改后重新运行,输入数据里的title会自动映射到name字段存入Avro文件,读取时就能拿到正确的值。
方法2:预处理输入数据
如果你的fastavro版本较低不支持上述参数,可以在读取jsonl数据后、写入Avro前手动做字段映射:
def map_aliases(record): if 'title' in record: record['name'] = record.pop('title') elif 'nickname' in record: record['name'] = record.pop('nickname') return record data = [map_aliases(r) for r in jsonlines.open('data.jsonl')]
内容的提问来源于stack exchange,提问作者gbeaven
相关产品推荐
相关产品推荐

