Как вложить записи в схему Avro?
Я пытаюсь заставить Python анализировать схемы Avro, такие как следующее...
from avro import schema
mySchema = """
{
"name": "person",
"type": "record",
"fields": [
{"name": "firstname", "type": "string"},
{"name": "lastname", "type": "string"},
{
"name": "address",
"type": "record",
"fields": [
{"name": "streetaddress", "type": "string"},
{"name": "city", "type": "string"}
]
}
]
}"""
parsedSchema = schema.parse(mySchema)
... и я получаю следующее исключение:
avro.schema.SchemaParseException: Type property "record" not a valid Avro schema: Could not make an Avro Schema object from record.
Что я делаю неправильно?
Ответы
Ответ 1
Согласно другим источникам в Интернете, я переписал бы ваше второе определение адреса:
mySchema = """
{
"name": "person",
"type": "record",
"fields": [
{"name": "firstname", "type": "string"},
{"name": "lastname", "type": "string"},
{
"name": "address",
"type": {
"type" : "record",
"name" : "AddressUSRecord",
"fields" : [
{"name": "streetaddress", "type": "string"},
{"name": "city", "type": "string"}
]
}
}
]
}"""
Ответ 2
Каждый раз, когда мы указываем тип как именованный тип, поле должно быть указано как:
"name":"some_name",
"type": {
"name":"CodeClassName",
"type":"record/enum/array"
}
Однако, если именованный тип является объединением, тогда нам не нужно дополнительное поле типа и должно использоваться как:
"name":"some_name",
"type": [{
"name":"CodeClassName1",
"type":"record",
"fields": ...
},
{
"name":"CodeClassName2",
"type":"record",
"fields": ...
}]
Надеюсь, что это еще раз пояснит!