2016-08-25 86 views
2

我是Hadoop和编程的新手,我对Avro架构的演变有点困惑。我会解释我对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} 
    ] 
} 

现在我的问题是,为什么我们需要进化?我已经读过,我们可以在模式中使用default来创建新字段;但如果我们在文件中添加一个新的模式,那么以前的模式将被覆盖。对于单个文件我们不能有两个模式。

另一个问题是,什么是读者和作家的模式,他们如何帮助?

回答

6

如果你有一个avro文件,并且你想改变它的模式,你可以在里面重新编写一个新模式的文件。但是如果你有几兆字节的avro文件而你想改变他们的模式呢?每次模式更改时,您是否会重写所有数据?

模式演进允许您更新用于写入新数据的模式,同时保持与旧数据模式的向后兼容性。然后你可以一起阅读它,就好像所有的数据都有一个模式一样。当然,为了保持兼容性,管理允许的更改有精确的规则。这些规则列在Schema Resolution之下。

除了进化之外,读者和写者模式还有其他用例。您可以使用阅读器作为过滤器。想象一下数百个领域的数据,其中您只对少数领域感兴趣。您可以为这几个字段创建一个模式,只读取您需要的数据。您可以采取另一种方式并创建一个添加默认数据的读取器模式,或者使用模式来加入两个不同数据集的模式。

或者您可以只使用一个模式,它永远不会改变,用于读写。这是最简单的情况。

+0

谢谢@ jaco0646的详细解释。 –