更改java包名后的avro反序列化

时间:2015-12-18 17:37:22

标签: avro

我想更改我们的avro类的java包名。 但是在这个改变之后,我怎样才能读出我现有的avro文件?

例如,我有通过序列化avro类“com.abc.MyObject”创建的avro文件。现在我想将类更改为“com.xyz.MyObject”。

读取使用旧包名创建的avro文件的最佳方法是什么?有没有办法告诉反序列化在avro文件中找到的类名“com.abc.MyObject”现在是“com.xyz.MyObject”?

我希望我能读取包含旧包名的avro文件,但是使用新包名将对象写入我们的数据存储(HBase)。

谢谢, 詹姆斯

1 个答案:

答案 0 :(得分:1)

我错误地认为问题比实际情况要大。

在包名更改后尝试读取现有的avro文件时,我收到此错误: org.apache.avro.AvroTypeException:找到com.abc.PropertyValueType,期待com.xyz.PropertyValueType

在我的架构中,PropertyValueType枚举被定义为此字段的枚举:

{"name": "value_type", "type": {"type":"enum", "name":"PropertyValueType", "symbols" : ["VALUE_STRING", "VALUE_DOUBLE", "VALUE_DATE", "VALUE_LONG"]} }

我发现上述错误的解决方案是别名: https://avro.apache.org/docs/1.7.7/spec.html#Aliases

我更新了avro架构,如下所示:

{"name": "value_type", "type": {"type":"enum", "name":"PropertyValueType", "symbols" : ["VALUE_STRING", "VALUE_DOUBLE", "VALUE_DATE", "VALUE_LONG"], "aliases" : ["com.abc.PropertyValueType"]} }

现在我的代码在读取包名更改之前创建的avro文件时没有问题。