Avro 1.8.2 Schema可选字段缺失抛出AvroTypeException异常问题
Avro 1.8.2 可选字段缺失时解析抛出AvroTypeException问题
使用Avro 1.8.2版本处理Avro消息时存在运行异常:当输入的JSON消息缺失Schema中已声明为可选的字段时,解析流程无法正常执行,抛出异常:org.apache.avro.AvroTypeException: Expected field name not found: username
复现步骤
- 步骤1:创建JSON文件
test.json,文件中缺失username字段,内容如下:
{ "tweet":"Simple message.", "timestamp":7866844999 }
- 步骤2:创建Schema定义文件
schema.avsc,其中username字段被声明为可选类型,内容如下:
{ "type":"record", "name":"test_schema", "namespace":"com.test.avro", "fields":[ { "name":"username", "type":[ "null", "string" ], "default":null, "doc":"doc 1" }, { "name":"tweet", "type":"string", "doc":"doc 2" }, { "name":"timestamp", "type":"long", "doc":"doc 3" } ], "doc:":"A basic schema" }
- 步骤3:下载对应版本的avro-tools jar包,执行以下命令即可复现异常:
java -jar avro-tools-1.8.2.jar fromjson --schema-file schema.avsc test.json
问题原因
这是Avro 1.8.2版本自带的已知缺陷:该版本的JSON解析逻辑没有做默认值自动填充的处理,哪怕字段声明为可选类型、且配置了null默认值,只要输入JSON里没显式传这个字段,解析器就会直接抛字段不存在的类型错误,根本不会读取Schema中配置的默认值补全字段。
解决方法
- 最省事的方案是直接把Avro升级到1.9.0及以上版本,高版本已经修复了这个解析逻辑问题,执行相同的fromjson命令时,会自动为缺失的可选字段填充配置的默认值,可正常完成解析。
- 若项目依赖锁死必须使用1.8.2版本,就不要直接用avro-tools的fromjson命令,自行编写解析逻辑:反序列化前先校验输入JSON的字段集合,对缺失的、配置了默认值的字段手动补入对应默认值后,再走Avro反序列化流程即可。
内容的提问来源于stack exchange,提问作者lalit
相关产品推荐
相关产品推荐

