如何在现有字段中间添加新字段来处理hive / avro架构演变?

时间:2017-08-08 23:46:43

标签: hadoop hive avro

我被告知,Hive能够处理向avro模式添加新字段的唯一方法是在现有字段的末尾添加新字段。目前我们的avro代是按字母顺序排列的,因此新字段可以显示在字段列表的其他位置。

那么,Hive可以处理这个吗?我对Hive几乎一无所知,但我可以看到there are good explanations如何从avro添加新字段,但我似乎无法找到有关添加字段位置是否影响的任何信息Hive处理它们的能力。

举个例子,见下文。 如何将新架构处理成Hive?

原始架构

{
"type":"record","name":"user",
   "fields":[
       {"name":"bday","type":"string"},
       {"name":"id","type":"long"},
       {"name":"name","type":"string"}
   ]
}

新架构(按字母顺序添加字段)

{
"type":"record","name":"user",
   "fields":[
       {"name":"bday","type":"string"},
       {"name":"id","type":"long"},
       {"name":"gender","type":"string"},
       {"name":"name","type":"string"}
   ]
}

2 个答案:

答案 0 :(得分:1)

支持。您必须注意为新字段添加默认值,以便能够读取使用旧架构编写的数据。

答案 1 :(得分:1)

是的,Hive可以解决这个问题,因为这是Avro works

的方式
  

如果两者都是记录:   字段的顺序可能不同:字段按名称匹配

这是可能的,因为所有Avro文件还包括用于写入数据的模式, writer的模式。 因此,当您在Hive中更改架构时(例如,通过修改avro.schema.url基础文件),您可以更改读者的架构。但是所有现有文件及其作者的模式都保持不变。

是的,对于添加的所有新字段,无论字段顺序如何,都必须提供默认值(使用"default":...)。否则,阅读器(Hive)将无法解析用原始模式编写的文件。