Avro Schema适配问题:Kafka消息生成报Expected start-union错误排查
问题分析与修正方案
错误原因
你遇到的AvroTypeException: Expected start-union. Got VALUE_STRING错误,加上测试数据的其他问题,主要来自三个方面:
- 联合类型(Union)格式不符合规范:schema中
customerNumber和loyalitynumber是["null", "string"]联合类型,Avro要求非null值必须用{"string": "值"}的键值对格式包裹,而非直接写字符串。 - 字段名不匹配:schema定义的数组字段是
loyalitycodes,但测试数据里写成了entitlementCodes,字段名完全不一致。 - 数组结构错误:schema中
loyalitycodes是字符串数组,测试数据却写成了包含对象的数组,不符合元素类型定义。
修正后的正确测试数据
以下是完全符合schema要求的JSON测试数据:
{ "customerId": "ahdzeha46", "customerNumber": {"string": "473363621"}, "loyalitynumber": {"string": "45354456456"}, "correlationId": "corr-473363621", "timestamp": "2021-08-09T12:20:15", "sku": "NO", "loyalitycodes": ["A238472ASD", "B12345XYZ"] }
如果需要给联合类型字段赋null值,直接写null即可,示例:
{ "customerId": "ahdzeha46", "customerNumber": null, "loyalitynumber": {"string": "45354456456"}, "correlationId": "corr-473363621", "timestamp": "2021-08-09T12:20:15", "sku": "YES", "loyalitycodes": [] }
额外说明
- 部分Avro序列化工具支持
["null", X]类型的简化写法(直接写X类型的值),但为了兼容性,建议统一使用{"X": 值}的格式。 - 枚举类型
sku的值只能是schema中定义的NO或YES,不能使用其他字符串。 - 数组
loyalitycodes的元素必须是纯字符串,不能嵌套对象。
内容的提问来源于stack exchange,提问作者data2quest
相关产品推荐
相关产品推荐

