我使用avro-tools将我的avro架构转换为Java类,我将其传递给Avro-Map-Input-Key-Schema
进行数据处理。这一切都很好。
但是最近我不得不向avro架构添加一个新列并重新编译java类。
这是我遇到问题的地方,因为我以前生成的数据是由旧方案序列化的,所以我的MapReduce作业现在在修改架构后失败,即使我的MapReduce逻辑没有使用新列。
因此,我想知道我是否可以停止传递Java模式类并从数据中检索模式并动态处理数据,这是可能的。
我认为不是!
答案 0 :(得分:0)
是的,没有。但是您可以将其作为GenericRecord
读取,然后将字段映射到更新的类型对象。我在高级别here进行了这一点。
答案 1 :(得分:0)
可以使用更新的架构读取现有数据。 Avro将始终使用其标头中的架构读取文件,但如果您还提供了预期的架构(或“读取架构”),则Avro将创建符合所请求架构的记录。最终会跳过未请求的字段或填写文件中缺少的字段的默认值。
在这种情况下,您希望为MapReduce作业设置读取架构和数据模型,如下所示:
AvroJob.setInputSchema(job, MyRecord.getClassSchema());
AvroJob.setDataModelClass(job, SpecificData.class);