You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fastavro别名转换Schema时遭遇SchemaResolutionError求助

问题解决:fastavro SchemaResolutionError 别名转换失败

问题原因

触发SchemaResolutionError的核心原因是顶层记录类型不兼容。写入数据时用的old_schema记录名为generated,读取时指定的new_schema记录名为test,fastavro会校验顶层类型的匹配性——即使字段配置了别名,若顶层记录没有别名映射,会被判定为完全不同的类型,导致解析失败。

修复方案

在new_schema的顶层记录定义中添加aliases字段,将旧记录名generated纳入其中,让fastavro识别这两个记录类型是兼容的。修改后的new_schema代码如下:

new_schema = parse_schema({
    "type": "record",
    "namespace": "com.node40",
    "name": "test",
    "aliases": ["generated"],  # 新增:添加旧记录名作为顶层别名
    "fields": [
        {
            "name": "k1",
            "type": "string",
            "aliases": ["key1"]
        },
        {
            "name": "k2",
            "type": "string",
            "aliases": ["key2"]
        },
        {
            "name": "k3",
            "type": "string",
            "aliases": ["key3"]
        }
    ]
})

完整可运行代码

from fastavro import writer, reader, json_writer
from fastavro.schema import parse_schema
from io import BytesIO

# Sample data
input_json = [
    {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3"
    }
]

# Old schema that matches the input_json
old_schema = parse_schema({
    "type": "record",
    "namespace": "com.node40",
    "name": "generated",
    "fields": [
        {
            "name": "key1",
            "type": "string"
        },
        {
            "name": "key2",
            "type": "string"
        },
        {
            "name": "key3",
            "type": "string"
        }
    ]
})

# New schema with old schema names as aliases (fixed version)
new_schema = parse_schema({
    "type": "record",
    "namespace": "com.node40",
    "name": "test",
    "aliases": ["generated"],  # 新增顶层记录别名
    "fields": [
        {
            "name": "k1",
            "type": "string",
            "aliases": ["key1"]
        },
        {
            "name": "k2",
            "type": "string",
            "aliases": ["key2"]
        },
        {
            "name": "k3",
            "type": "string",
            "aliases": ["key3"]
        }
    ]
})

# Write to buffer as serialized avro using old_schema
buffer = BytesIO()
writer(buffer, old_schema, input_json, validator=True)
buffer.seek(0)

# Read serialized avro from buffer, deserialize and write to json file
input_avro = reader(buffer, new_schema)
json_writer('fitted_data.json', new_schema, input_avro)

验证结果

运行修改后的代码,会成功生成fitted_data.json,文件内容为:

{"k1": "value1", "k2": "value2", "k3": "value3"}

内容的提问来源于stack exchange,提问作者jamzsabb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:15:45