如何处理hive/avro模式演化,在现有字段中间添加新字段?

6tr1vspr  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(685)

有人告诉我,只有这样,Hive才能处理添加到一个新的领域 avro 如果新字段添加到现有字段的末尾,则为schema。目前我们的 avro 生成是按字母顺序的,因此新字段可能会显示在字段列表的其他位置。
那么,Hive能不能搞定?我对Hive几乎一无所知,但我可以看到有很好的解释如何添加新的领域从 avro 但我似乎找不到任何关于添加字段的位置是否影响配置单元处理它们的能力的信息。
例如,请参见下文。如何将新架构处理到配置单元中
原始模式

{
"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"}
   ]
}
rqenqsqc

rqenqsqc1#

支持。您必须注意为新字段添加一个默认值,以便能够读取使用旧模式写入的数据。

1cosmwyk

1cosmwyk2#

是的,hive可以处理这个问题,因为这是avro的工作方式:
如果两者都是记录:字段的顺序可能不同:字段按名称匹配
这是可能的,因为所有avro文件还包括一个用于写入数据的模式,writer的模式。因此,当您更改配置单元中的模式时(例如,通过修改 avro.schema.url 基础文件),您可以更改读取器的架构。但所有现有文件及其编写器的模式都保持不变。
是的,对于所有添加的新字段,您必须提供一个默认值(使用 "default":... )不管字段顺序如何。否则,读取器(hive)将无法解析使用原始模式编写的文件。

相关问题