我使用avro-tools将avro schema转换为Java类,并将其传递给Avro-Map-Input-Key-Schema进行数据处理。这一切都运行得很好。
但是最近我不得不在avro schema中添加一个新的列,并重新编译java类。
这就是我遇到问题的地方,因为我以前生成的数据是由旧模式序列化的,所以在修改模式之后,我的MapReduce作业现在失败了,即使我的MapReduce逻辑没有使用新的列。
因此,我想知道是否可以停止传入Java schema类,并从数据中检索模式并(动态)处理数据,这是否可能。
我想它不是!
发布于 2015-07-11 00:50:14
是的,没有。但是您可以将其作为GenericRecord读取,然后将字段映射到更新后的类型对象。我在一个高级别的here中经历了这一切。
发布于 2015-10-08 02:54:35
可以使用更新的模式读取现有数据。Avro将始终使用其头中的模式读取文件,但如果您还提供了预期的模式(或“读取模式”),则Avro将创建符合该请求模式的记录。这最终会跳过未被请求的字段,或者填充文件中缺少的字段的默认值。
在本例中,您希望为MapReduce作业设置读取模式和数据模型,如下所示:
AvroJob.setInputSchema(job, MyRecord.getClassSchema());
AvroJob.setDataModelClass(job, SpecificData.class);https://stackoverflow.com/questions/27131942
复制相似问题