经过多次尝试,我无法解码 fastavro 库在根据架构验证数据时抛出的错误。以下是我得到的内容
File "fastavro\\_validation.pyx", line 301, in fastavro._validation.validate
File "fastavro\\_validation.pyx", line 311, in fastavro._validation.validate
File "fastavro\\_validation.pyx", line 296, in fastavro._validation._validate
fastavro._validate_common.ValidationError: [
" is <[{'id': '123 Drive Street', 'address': [{'address_line1': 'no'}]}]> of type <class 'list'> expected {'type': 'record', 'name': 'example.avro.Person', 'fields': [{'name': 'id', 'type': 'string'}, {'name': 'address', 'type': {'type': 'array', 'items': {'type': 'record', 'name': 'example.avro.Address', 'fields': [{'name': 'address_line1', 'type': 'string'}]}}}], '__fastavro_parsed': True, '__named_schemas': {'example.avro.Person': {'type': 'record', 'name': 'example.avro.Person', 'fields': [{'name': 'id', 'type': 'string'}, {'name': 'address', 'type': {'type': 'array', 'items': {'type': 'record', 'name': 'example.avro.Address', 'fields': [{'name': 'address_line1', 'type': 'string'}]}}}]}, 'example.avro.Address': {'type': 'record', 'name': 'example.avro.Address', 'fields': [{'name': 'address_line1', 'type': 'string'}]}}}"
]
这是一个更大的 kafka 项目的一部分,我正在尝试实现该项目,其中我有一个具有嵌套结构的 avro 模式。下面是代码
import fastavro
from fastavro import parse_schema
household_schema = {
"namespace": "example.avro",
"type": "record",
"name": "Person",
"fields": [
{
"name": "id",
"type": "string"
},
{
"name": "address",
"type": {
"type": "array",
"items": {
"type": "record",
"name": "Address",
"fields": [
{
"name": "address_line1",
"type": "string"
}
]
}
}
}
]
}
records = [
{
"id": "123 Drive Street",
"address": [
{
"address_line1": "no"
}
]
}
]
parsed_schema = parse_schema(household_schema)
fastavro.validate(records, parsed_schema)
我使用 Pycharm 插件 - AVRO 随机生成器基于模式生成示例数据
{
"id": "vrfofjyifppdyucdtx",
"address": [
{
"address_line1": "no"
}
]
}
这也是我在代码中尝试做的事情,但没有成功。我看了一篇有类似问题的帖子,但这也没有帮助 使用 Python3 处理 AVRO 的嵌套模式
我还查看了 fastavro 文档,其中显示了嵌套结构和示例数据的示例,并尝试了相同的方法,但没有运气
https://fastavro.readthedocs.io/en/latest/writer.html
过去两天我一直在努力解决这个问题,但一直无法解决这个问题,所以有人可以帮我解决这个问题吗
fastavro.validate
期望仅验证一条记录。所以你只需要将最后一行更改为fastavro.validate(records[0], parsed_schema)
。
如果您想验证多个记录,您可以执行
from fastavro.validation import validate_many
,然后最后一行将是 validate_many(records, parsed_schema)
。