【问题标题】:Why we need Avro schema evolution为什么我们需要 Avro 模式演化
【发布时间】:2017-01-01 07:21:50
【问题描述】:

我是 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}
    ]
}

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

另一个问题是,什么是读取器和写入器模式,它们有什么帮助?

【问题讨论】:

    标签: hadoop avro


    【解决方案1】:

    如果您有一个 avro 文件并且想要更改其架构,您可以使用其中的新架构重写该文件。但是,如果您有数 TB 的 avro 文件并且想要更改它们的架构怎么办?每次架构更改时,您会重写所有数据吗?

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

    除了进化之外,读者和作者模式还有其他用例。您可以将阅读器用作过滤器。想象一下包含数百个字段的数据,而您只对其中的一小部分感兴趣。您可以为少数字段创建模式,以仅读取您需要的数据。您可以另辟蹊径,创建一个添加默认数据的读取器架构,或者使用一个架构来连接两个不同数据集的架构。

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

    【讨论】:

    • 感谢@jaco0646 的详细解释。
    猜你喜欢
    • 2011-01-20
    • 2012-05-07
    • 2023-04-06
    • 1970-01-01
    • 2019-06-09
    • 2012-05-15
    • 2016-11-18
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多