根据模式 FastAvro 验证数据时出现验证错误

问题描述 投票:0回答:1

经过多次尝试,我无法解码 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

过去两天我一直在努力解决这个问题,但一直无法解决这个问题,所以有人可以帮我解决这个问题吗

python-3.x apache-kafka avro kafka-python fastavro
1个回答
0
投票

fastavro.validate
期望仅验证一条记录。所以你只需要将最后一行更改为
fastavro.validate(records[0], parsed_schema)

如果您想验证多个记录,您可以执行

from fastavro.validation import validate_many
,然后最后一行将是
validate_many(records, parsed_schema)

© www.soinside.com 2019 - 2024. All rights reserved.