如何在现有字段中间添加新字段来处理 hive/avro 模式演变?
How to handle hive/avro schema evolution with new fields added in the middle of existing fields?
我听说 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"}
]
}
支持。您必须注意为新字段添加默认值,以便能够读取使用旧模式写入的数据。
是的,Hive 可以处理这个,因为它是 Avro works:
if both are records:
the ordering of fields may be different: fields are matched by name
这是可能的,因为所有 Avro 文件还包含用于写入数据的模式,作者的模式。
因此,当您更改 Hive 中的架构时(例如,通过修改 avro.schema.url
基础文件),您更改了 reader 的架构。但所有现有文件及其编写者的模式都保持不变。
是的,对于添加的所有新字段,无论字段顺序如何,您都必须提供默认值(使用 "default":...
)。否则,reader (Hive) 将无法解析使用原始模式编写的文件。
我听说 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"}
]
}
支持。您必须注意为新字段添加默认值,以便能够读取使用旧模式写入的数据。
是的,Hive 可以处理这个,因为它是 Avro works:
if both are records: the ordering of fields may be different: fields are matched by name
这是可能的,因为所有 Avro 文件还包含用于写入数据的模式,作者的模式。
因此,当您更改 Hive 中的架构时(例如,通过修改 avro.schema.url
基础文件),您更改了 reader 的架构。但所有现有文件及其编写者的模式都保持不变。
是的,对于添加的所有新字段,无论字段顺序如何,您都必须提供默认值(使用 "default":...
)。否则,reader (Hive) 将无法解析使用原始模式编写的文件。