我是Hadoop和编程新手,我对Avro架构演变有点困惑。到目前为止,我将解释我对Avro的理解。
Avro是一个序列化工具,它将json模式存储在顶部,存储二进制数据。架构看起来像这样。
{
"namespace":"com.trese.db.model",
"type":"record",
"doc":"This Schema describes about Product",
"name":"Product",
"fields":[
{"name":"product_id","type": "long"},
{"name":"product_name","type": "string","doc":"This is the name of the product"},
{"name":"cost","type": "float", "aliases":["price"]},
{"name":"discount","type": "float", "default":5}
]
}
现在我的问题是为什么我们需要 evolution ?我已经读过,我们可以在架构中使用default
来获取新字段;但是如果我们在文件中添加新模式,那么早期的模式将被覆盖。我们不能为单个文件提供两个模式。
另一个问题是,什么是读者和作者模式以及它们如何帮助?
答案 0 :(得分:23)
如果您有一个avro文件并且想要更改其架构,则可以使用新架构重写该文件。但是,如果您有数TB的avro文件并且想要更改其架构,该怎么办?每次架构更改时,您是否会重写所有数据?
Schema evolution允许您更新用于编写新数据的模式,同时保持与旧数据模式的向后兼容性。然后你可以一起阅读它,好像所有数据都有一个模式。当然,有精确的规则来管理允许的更改,以保持兼容性。这些规则列在Schema Resolution下。
除了进化之外,还有读写器模式的其他用例。您可以使用阅读器作为过滤器。想象一下数百个领域的数据,其中你只对少数领域感兴趣。您可以为少数几个字段创建架构,以便只读取您需要的数据。您可以采用另一种方式创建一个添加默认数据的reader模式,或使用模式连接两个不同数据集的模式。
或者你可以使用一个永不改变的架构来进行读写。这是最简单的情况。