在另一个 Avro 模式中引用或导入 Avro 模式

Refering or Importing Avro Schemas in another Avro Schema

我有一个主要的 avro 模式和其他小的 avro 模式。主要的 avro 模式指的是其他小的 avro 模式,如下所示:

Item.avsc

{
    "namespace":"com.example.common",
    "name":"Item",
    "type":"record",
    "fields":[
        {
            "name":"ItemId",
            "type":"com.example.common.ItemId"
        },
        {
            "name":"features",
            "type":"com.example.common.Features"
        }
    ]
}

ItemId.avsc

{
    "namespace":"com.example.common",
    "name":"ItemId",
    "type":"record",
    "fields":[
        {
            "name":"id",
            "type":"int"
        }
    ]
}

Features.avsc

{
    "namespace":"com.example.common",
    "name":"Features",
    "type":"record",
    "fields":[
        {
            "name":"Range",
            "type":{
                "type":"array",
                "items":"com.example.common.Range"
            }
        }
    ]
}

还有一个Range.avsc但是我没有写,问题变得太长了

所有这些文件都在名为“com.example.common”的文件夹中

我写了一行简单的 python 代码来解析和打印 Item.avsc:

的模式
import avro.schema

schema = avro.schema.parse(open("./com.example.common/Item.avsc", "rb").read())
print(schema)

但它引发了:

avro.schema.SchemaParseException: Could not make an Avro Schema object from com.example.common.ItemId.
avro.schema.SchemaParseException: Type property "com.example.common.ItemId" not a valid Avro schema: Could not make an Avro Schema object from com.example.common.ItemId.

我们如何读取架构中的引用架构?

我不确定这是否可以通过标准 avro 库来完成,但如果您使用 fastavro 库,则有一个函数可以做到这一点。它被称为 load_schema: https://fastavro.readthedocs.io/en/latest/schema.html#fastavro._schema_py.load_schema

Will recursively load referenced schemas assuming they can be found in files in the same directory and named with the convention <full_name>.avsc

在你的例子中,代码看起来像这样:

from fastavro.schema import load_schema
parsed_schema = load_schema("./com.example.common/Item.avsc")