读取Avro文件会产生AvroTypeException:缺少必需的字段错误(即使新字段在架构中声明为null)

Kir*_*anM 4 java hadoop avro

我试图反序列化/读取Avro文件,avro数据文件没有新字段.即使新模式在模式中声明为null,也应该是可选的.但它仍然给我错误的强制性.

线程"main"中的异常org.apache.avro.AvroTypeException:找到com.kiran.avro.User,期望com.kiran.avro.User,缺少必填字段loc

AVRO架构声明:

{"name": "loc", "type": ["string", "null"]}
Run Code Online (Sandbox Code Playgroud)

使用代码读取文件:

DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来声明可选字段?

感谢提示/建议!!

小智 5

"文件"的内容是什么?

我可能错了,但是如果你在模式中定义一个字段{"name": "loc", "type": ["string", "null"]},你仍然需要定义一个loc字段,即使是null.它应该类似于"loc": null文件中的内容.

尝试添加"default"到此字段声明:

{"name" : "loc",
"type" :  ["null","string"] ,
"default" : null}
Run Code Online (Sandbox Code Playgroud)

然后应该可以在文件中省略该字段.

您还可以看到此问题Avro:反序列化json - schema以及可选字段以获取一些其他信息和示例.