文档章节

Avro 模式演化与排序

为为02
 为为02
发布于 2017/04/15 00:35
字数 862
阅读 71
收藏 0

Avro 模式演化与排序

Avro 模式的演化

Avro的读操作不同于写操作,读操作可以动态的控制要取出的数据,而这种动态,在Avro中被称为演化。

#####演化一:读取新增字段 Avro 可以读取预定模式所规定格式的文件数据,也可以支持模式的演化。例如,我们将上篇文章引用的模式 StringPair.avsc 再加上一个字段,形成一个新模式:

    {
      "type": "record",
      "name": "StringPair",
      "doc": "A pair of strings.",
      "fields": [
        {"name": "left", "type": "string"},
        {"name": "right", "type": "string"},
        {"name" : "num", "type" : "int"},
        {"name" : "description", "type" : ["string",null],"default":"null"}
      ]
    }

使用这个新模式重新读取前面序列化的数据,发现依旧能够正常的读取,这是因为给 description 字段指定了默认值 “” ,供 Avro 在读取没有定义的字段的纪录时使用。如果在这 schema 中没有 default 属性,读取旧数据时就会发生错误。

演化二: 读取部分字段

Avro 还支持忽略部分数据去读取。在很多应用中我们只需要大量字段中的某一部分,这时我们就可以使用 Avro中的投影去读取数据。例如我们要只读取 StringPair.avsc 中的 right 字段

         {
                  "type": "record",
                  "name": "StringPair",
                  "doc": "A pair of strings.",
                  "fields": [
                    {"name": "right", "type": "string"}
                  ]
                }

模式解析规则可以直接解决模式由一个版本演化为另一个版本时可能产生的问题,Avro规范中对所有的Avro类型均有详细的说明。

演化三: 别名

别名允许在读取Avro数据的模式与写入Avro数据的模式时使用不同的名称。例如下面读数据可以使用新的字段名称而不是写入时字段的名称,来读取 StringPair 的数据。

                        {
                          "type": "record",
                          "name": "StringPair",
                          "doc": "A pair of strings.",
                          "fields": [
                            {"name": "R", "type": "string","aliases":"right"}
                          ]
                        }

注意,别名的主要作用是讲写入模式转换为读取模式,但是别名对读程序是不可见的。也就是说在上面的程序中读程序无法再使用 right 字段,因为它已经被转换成了 R 字段。

Avro 模式的排序

Avro定义了对象的排序方式,其大多数数据类型与期望的排序方式相符合,比如数值类型按照数值的升序进行排列。但还有一些类型的排序就会让人很无奈,如枚举通过符号的定义而非符号字符串的值来排序。 除了record类型之外其它类型均按照Avro规范中预定的规则来进行排序,这些规则用户无法进行改写。但对于纪录,可以指定order属性来控制排列的顺序。order属性可以有三个值:升序(ascending 默认)、降序(descending)或忽略(ignore)

    {
       "type": "record",
       "name": "StringPair",
       "doc": "A pair of strings.",
       "fields": [
         {"name": "left", "type": "string","order":"ignore"},
         {"name": "right", "type": "string","order":"ascending"},
         {"name" : "num", "type" : "int"}
       ]
     }

而且Avro是直接基于二进制数据进行比较的,其直接对字节流进行操作,比较的过程是无比高效的。Avro的排序逻辑主要是用于MapReduce中,实现数据文件的并行排序。下一篇我们将介绍 Avro MapReduce这个不使用传统的Writable而使用新的数据序列化方式的并行计算方式。

© 著作权归作者所有

为为02
粉丝 51
博文 44
码字总数 99356
作品 0
海淀
程序员
私信 提问
Apache Spark 2.4 内置的 Avro 数据源介绍

Apache Avro 是一种流行的数据序列化格式。它广泛用于 Apache Spark 和 Apache Hadoop 生态系统,尤其适用于基于 Kafka 的数据管道。从 Apache Spark 2.4 版本开始,Spark 为读取和写入 Avro...

Spark
2018/12/11
0
0
Apache Avro as a Built-in Data Source in Apache Spark 2.4

Apache Avro 是一种流行的数据序列化格式。它广泛用于 Apache Spark 和 Apache Hadoop 生态系统,尤其适用于基于 Kafka 的数据管道。从 Apache Spark 2.4 版本开始(参见 Apache Spark 2.4 正...

开源大数据EMR
04/12
0
0
Impala 表使用 Avro 文件格式(翻译)

Impala 表使用 Avro 文件格式 Cloudera Impala 支持数据文件使用 Avro 文件格式的表。Impala 可以查询 Avro 表,但目前不支持创建和插入数据。对于这些操作,使用 Hive 处理,然后切换回 Im...

weiqingbin
2014/01/20
1K
0
Apache Avro 1.8.1 发布

Apache Avro 1.8.1 发布了,Avro(读音类似于[ævrə])是Hadoop的一个子项目,由Hadoop的 创始人Doug Cutting(也是Lucene,Nutch等项目的创始人)牵头开发。Avro是一个数据序列化系统,设计...

oschina
2016/05/24
3.8K
0
【译】Apache Spark 2.4内置数据源Apache Avro

原文链接: Apache Avro as a Built-in Data Source in Apache Spark 2.4 Apache Avro 是一种流行的数据序列化格式。它广泛使用于 Apache Spark 和 Apache Hadoop 生态中,尤其适用于基于 Ka...

开源大数据
2018/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
7
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部