为什么我们需要 Avro 模式演进

Why we need Avro schema evolution

我是 Hadoop 和编程的新手,对 Avro 模式演化有点困惑。我将解释到目前为止我对 Avro 的理解。

A​​vro 是一种序列化工具,它在顶部使用 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;但是如果我们在文件中添加一个新的模式,之前的模式将被覆盖。一个文件不能有两个模式。

另一个问题是,什么是 reader 和 writer 模式,它们有什么帮助?

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

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

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

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