为什么我们需要 Avro 模式演进
Why we need Avro schema evolution
我是 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
;但是如果我们在文件中添加一个新的模式,之前的模式将被覆盖。一个文件不能有两个模式。
另一个问题是,什么是 reader 和 writer 模式,它们有什么帮助?
如果您有一个 avro 文件并且您想要更改其模式,您可以使用新的模式重写该文件。但是,如果您有数 TB 的 avro 文件并且想要更改它们的架构怎么办?每次架构更改时,您都会重写所有数据吗?
模式演变允许您更新用于写入新数据的模式,同时保持与旧数据模式的向后兼容性。然后您可以一起阅读它们,就好像所有数据都具有一个模式一样。当然,有精确的规则来管理允许的更改,以保持兼容性。这些规则列在 Schema Resolution.
下
除了进化之外,reader 和编写器模式还有其他用例。您可以使用 reader 作为过滤器。想象一下包含数百个字段的数据,而您只对其中的一小部分感兴趣。您可以为少数字段创建一个模式,以仅读取您需要的数据。您可以换一种方式创建一个 reader 模式来添加默认数据,或者使用一个模式来连接两个不同数据集的模式。
或者您可以只使用一个模式,它永远不会改变,同时用于读取和写入。这是最简单的情况。
我是 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
;但是如果我们在文件中添加一个新的模式,之前的模式将被覆盖。一个文件不能有两个模式。
另一个问题是,什么是 reader 和 writer 模式,它们有什么帮助?
如果您有一个 avro 文件并且您想要更改其模式,您可以使用新的模式重写该文件。但是,如果您有数 TB 的 avro 文件并且想要更改它们的架构怎么办?每次架构更改时,您都会重写所有数据吗?
模式演变允许您更新用于写入新数据的模式,同时保持与旧数据模式的向后兼容性。然后您可以一起阅读它们,就好像所有数据都具有一个模式一样。当然,有精确的规则来管理允许的更改,以保持兼容性。这些规则列在 Schema Resolution.
下除了进化之外,reader 和编写器模式还有其他用例。您可以使用 reader 作为过滤器。想象一下包含数百个字段的数据,而您只对其中的一小部分感兴趣。您可以为少数字段创建一个模式,以仅读取您需要的数据。您可以换一种方式创建一个 reader 模式来添加默认数据,或者使用一个模式来连接两个不同数据集的模式。
或者您可以只使用一个模式,它永远不会改变,同时用于读取和写入。这是最简单的情况。