Разбор нескольких AVRO (файлов avsc), которые ссылаются друг на друга с помощью python (fastavro)
У меня есть схема AVRO, которая в настоящее время находится в одном файле avsc, как показано ниже. Теперь я хочу переместить запись адреса в другой общий файл avsc, на который следует ссылаться из многих других файлов avsc. Таким образом, Клиент и адрес будут отдельными файлами avsc. Как я могу разделить их и иметь клиентский файл avsc с адресом ссылки на файл avsc. Также как оба файла могут быть обработаны с помощью python. В настоящее время я использую быстрый avro в python3 для обработки одного файла avsc, но открыт для использования любой другой утилиты в python3 или pyspark.
Имя файла - customer_details.avsc
[
{
"type": "record",
"namespace": "com.company.model",
"name": "AddressRecord",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
},
{
"name": "state",
"type": "string"
},
{
"name": "zip",
"type": "string"
}
]
},
{
"namespace": "com.company.model",
"type": "record",
"name": "Customer",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "email",
"type": "string"
},
{
"name": "phone",
"type": "string"
},
{
"name": "address",
"type": {
"type": "array",
"items": "com.company.model.AddressRecord"
}
}
]
}
]
import fastavro
s1 = fastavro.schema.load_schema('customer_details.avsc')
Как можно разделить схему в другом файле, где на файл записи адреса можно ссылаться из другого файла avsc. Тогда как мне обработать несколько файлов avsc с помощью быстрого Avro (Python) или любой другой утилиты python?
1 ответ
Для этого схема для AddressRecord
должен быть в файле с именем com.company.model.AddressRecord.avsc
со следующим содержанием:
{
"type": "record",
"namespace": "com.company.model",
"name": "AddressRecord",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
},
{
"name": "state",
"type": "string"
},
{
"name": "zip",
"type": "string"
}
]
}
В Customer
схема не обязательно требует специального соглашения об именах, поскольку это схема верхнего уровня, но, вероятно, было бы неплохо следовать тому же соглашению. Так что это будет в файле с именемcom.company.model.Customer.avsc
со следующим содержанием:
{
"namespace": "com.company.model",
"type": "record",
"name": "Customer",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "email",
"type": "string"
},
{
"name": "phone",
"type": "string"
},
{
"name": "address",
"type": {
"type": "array",
"items": "com.company.model.AddressRecord"
}
}
]
}
Файлы должны находиться в одном каталоге.
Тогда вы сможете сделать fastavro.schema.load_schema('com.company.model.Customer.avsc')