Разбор нескольких 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')

Другие вопросы по тегам