解析使用 python 相互引用的多个 AVRO(avsc 文件)(fastavro)

Parsing Multiple AVRO (avsc files) which refer each other using python (fastavro)

我有一个 AVRO 模式,它目前位于单个 avsc 文件中,如下所示。现在我想将地址记录移动到一个不同的通用 avsc 文件,该文件应该从许多其他 avsc 文件中引用。所以 Customer 和 address 将是单独的 avsc 文件。我如何将它们分开并让客户 avsc 文件参考地址 avsc 文件。此外,如何使用 python 处理这两个文件。我目前在 python3 中使用快速 avro 来处理单个 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 文件中引用。那么我将如何使用快速 Avro (Python) 或任何其他 python 实用程序处理多个 avsc 文件?

为此,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')