解析使用 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')
我有一个 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')