fastavro校验嵌套Avro Schema时出现ValidationError求助
问题:fastavro校验嵌套Avro Schema时抛出ValidationError
报错信息
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'}]}}}" ]
相关代码
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)
生成的示例数据
{ "id": "vrfofjyifppdyucdtx", "address": [ { "address_line1": "no" } ] }
解决方案
问题核心是数据类型不匹配:你传入的records是列表,但fastavro.validate默认校验单个符合Person record类型的数据,而非列表。有两种解决方式:
方式1:用validate_many校验列表数据
将最后一行校验代码替换为:
fastavro.validate_many(records, parsed_schema)
方式2:校验单个记录
如果仅需校验单条数据,直接传入列表中的单个元素:
fastavro.validate(records[0], parsed_schema)
内容的提问来源于stack exchange,提问作者Deepak_Spark_Beginner
相关产品推荐
相关产品推荐

