在另一个 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")
我有一个主要的 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")