当前位置: 首页 > 知识库问答 >
问题:

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

马星阑
2023-03-14

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

现在我的问题是为什么我们需要进化?我已经了解到,我们可以在新字段的模式中使用<code>default</code>选项;但是,如果我们在文件中添加一个新的模式,早期的模式将被覆盖。一个文件不能有两个架构。

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

共有1个答案

范浩荡
2023-03-14

如果你有一个avro文件,你想改变它的模式,你可以用一个新的模式重写这个文件。但是如果你有太多的avro文件,你想改变它们的模式呢?每次模式改变时,你会重写所有的数据吗?

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

除了进化之外,读取器和写入器模式还有其他用例。你可以使用阅读器作为过滤器。假设数据有数百个字段,而您只对其中的一小部分感兴趣。您可以为这些字段创建一个模式,只读取您需要的数据。您可以反其道而行之,创建一个添加默认数据的读取器模式,或者使用一个模式来连接两个不同数据集的模式。

或者,您可以只使用一个架构,该架构永远不会更改,用于读取和写入。这是最简单的情况。

 类似资料:
  • 类,这三个类从它继承:。 应用程序希望在12AM到达时发送一条消息。 书中推荐观察者模式。指出如果增加新的类:扩展消息,会影响类时钟的实现。但我不明白为什么。类Clock将保存对象的集合,如果我们要添加一个新的inherit类,它不会更改Clock类。 如果有人能解释上面的例子,或者给出一个更好的例子,我将不胜感激。

  • 如果我使用模式版本1序列化一个对象,然后将模式更新为版本2(比如添加一个字段),那么在以后反序列化该对象时是否需要使用模式版本2?理想情况下,我只希望使用模式版本2,并使反序列化对象具有在对象最初序列化后添加到模式中的字段的默认值。 也许一些代码会更好地解释... 架构 1: 方案2: 使用通用非代码生成方法: 导致EOFException。使用会导致AvroTypeException。 我知道如

  • 问题内容: Angular应用使用属性而不是事件。 为什么是这样? 问题答案: ng-click包含一个角度表达式。Angular表达式是在Angular 范围的上下文中求值的,该范围绑定到具有ng- click属性的元素或该元素的祖先。 Angular表达式语言不包含流控制语句,也不能声明变量或定义函数。这些限制意味着模板只能访问由控制器或指令提供的变量和运行功能。

  • 以我的拙见,关于“什么是单子”这个著名问题的答案,尤其是投票最多的答案,试图解释什么是单子,而没有明确解释为什么单子是真正必要的。它们能被解释为一个问题的解决方案吗?

  • 为什么我们需要字典? 计算机最适合使用数字,而人类最适合使用姓名。我们创建了DNS以便记住主机名而不是IP地址。字典以相同的方式使用,因此我们可以记住AVP名称而不是类型编号。当FreeRADIUS解析请求或生成响应时,会查阅字典。 但是,字典与DNS不同,因为RADIUS客户端不知道FreeRADIUS使用的这些“友好”名称。永远不会在RADIUS客户端和RADIUS服务器之间交换AVP名称。

  • 问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观