`
guibin
  • 浏览: 366573 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AVRO1.4.1规范-Schema的定义和声明

    博客分类:
  • AVRO
阅读更多
AVRO1.4.1规范-Schema的定义和声明(参考自http://avro.apache.org/docs/current/spec.html
guibin.beijing@gmail.com

Avro 1.4.1规范定义了Avro序列化系统,它即将成为官方规范,Avro的各种实现方式必须遵循该规范。2

Schema定义
AVRO的Schema是用JSON的格式表示的,Schema可以用
  • JSON String 来命名一个定义的类型
  • JSON 对象,形式如:
  • 引用
    {"type": "typeName" ...attributes...}

    typeName可以是一个原生类型或者下面将要定义的衍生类型。这篇文档没有定义JSON对象中的属性,这些属性可以成为meta data,但是不能影响序列化数据的格式。
  • JSON 数组,代表内嵌类型的并集(union)。


原生类型
原生类型如下所示:
  • null: 表示没有值
  • boolean: 表示一个二进制布尔值
  • int: 表示32位有符号整数
  • long: 表示64位有符号整数
  • float: 表示32位的单精度浮点数(IEEE 754)
  • double: 表示64位双精度浮点数(IEEE 754)
  • bytes: 表示8位的无符号字节序列
  • string: Unicode 编码的字符序列
  • 总共就这8种原生数据类型,这些原生数据类型均没有明确的属性。

原生数据类型也可以使用JSON定义类型名称,比如schema "string"和{"type": "string"}是同义且相等的。

复杂类型
AVRO支持6种类型的复杂类型,分别是:records, enums, arrays, maps, unions and fixed.
Records
Records使用类型名称“record”,并且支持三个必选属性。
  • type: 必有属性。
  • name: 必有属性,是一个JSON string,提供了记录的名字。
  • namespace,也是一个JSON string,用来限定和修饰name属性。
  • doc: 可选属性,是一个JSON string,为使用这个Schema的用户提供文档。
  • aliases: 可选属性,是JSON的一个string数组,为这条记录提供别名。
  • fields: 必选属性,是一个JSON数组,数组中列举了所有的field。每一个field都是一个JSON对象,并且具有如下属性:
  •     name: 必选属性,field的名字,是一个JSON string。
        doc: 可选属性,为使用此Schema的用户提供了描述此field的文档。
        type: 必选属性,定义Schema的一个JSON对象,或者是命名一条记录定义的JSON string。
        default: 可选属性,即field的默认值,当读到缺少这个field的实例时用到。默认值的允许的范围由这个field的Schama的类型决定,如下表所示。其中union fields的默认值对应于union中第一个Schema。Bytes和fixed的field的默认值都是JSON string,并且指向0-255的unicode都对应于无符号8位字节值0-255。
    field default values
    avro typejson typeexample
    nullnullnull
    booleanbooleantrue
    int, longinteger1
    float, doublenumber1.1
    bytesstring"\u00ff"
    stringstring"foo"
    recordobject{"a":1}
    enumstring"FOO"
    arrayarray[1]
    mapobject{"a":1}
    fixedstring"\u00ff"

        order: 可选属性,指定这个field如何影响record的排序。有效的可选值为“ascending”(默认),"descending"和"ignore"
        alias: JSON的string数组,为这个field提供别名。

    比如,一个64位值的链表定义为
    引用
    {
      "type": "record",
      "name": "LongList",
      "aliases": ["LinkedLongs"],                      // old name for this
      "fields" : [
        {"name": "value", "type": "long"},             // each element has a long
        {"name": "next", "type": ["LongList", "null"]} // optional next element
      ]
    }



Enums
Enums使用的名为“enum”的type并且支持如下的属性:
  • name: 必有属性,是一个JSON string,提供了enum的名字。
  • namespace,也是一个JSON string,用来限定和修饰name属性。
  • aliases: 可选属性,是JSON的一个string数组,为这个enum提供别名。
  • doc: 可选属性,是一个JSON string,为使用这个Schema的用户提供文档。
  • symbols: 必有属性,是一个JSON string数组,列举了所有的symbol,在enum中的所有symbol都必须是唯一的,不允许重复。比如下面的例子:
  • 引用
    { "type": "enum",
      "name": "Suit",
      "symbols" : ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]
    }



Arrays
Array使用名为"array"的type,并且支持一个属性
  • items: array中元素的Schema
  • 比如一个string的数组声明为:
    引用
    {"type": "array", "items": "string"}



Maps
Map使用名为"map"的type,并且支持一个属性
  • values: 用来定义map的值的Schema。Maps的key都是string。比如一个key为string,value为long的maps定义为:
  • 引用
    {"type": "map", "values": "long"}



Unions
Unions就像上面提到的,使用JSON的数组表示。比如
引用
["string", "null"]
声明了一个union的Schema,其元素即可以是string,也可以是null。
Unions不能包含多个相同类型的Schema,除非是命名的record类型、命名的fixed类型和命名的enum类型。比如,如果unions中包含两个array类型,或者包含两个map类型都不允许;但是两个具有不同name的相同类型却可以。由此可见,union是通过Schema的name来区分元素Schema的,因为array和map没有name属性,当然只能存在一个array或者map。(使用name作为解析的原因是这样做会使得读写unions更加高效)。unions不能紧接着包含其他的union。

Fixed
Fixed类型使用"fixed"的type name,并且支持三个属性:
  • name: 必有属性,表示这个fixed的名称,JSON string。
  • namespace同上
  • aliases: 可选属性,同上
  • size: 必选属性,一个整数,志明每个值的字节数。
  • 比如16字节的fixed可以声明为:
    引用
    {"type": "fixed", "size": 16, "name": "md5"}



Names
Record, enums 和 fixed都是命名的类型,这三种类型都各有一个全名,全名有两部分组成:名称和命名空间。名称的相等是定义在全名基础上的。
全名的名字部分和record的field名字必须:
  • 以[A-Za-z_]开头
  • 接下来的名字中只能包含[A-Za-z0-9_]
  • namespace是以点分隔的一系列名字。
    In record, enum and fixed definitions, the fullname is determined in one of the following ways:
    在record、enum和fixed的定义中,全名由以下的任意一条决定:
  • 同时指定name和namespace,比如使用 "name": "X", "namespace": "org.foo"来表示全名org.foo.X。
  • 指定全名。如果name中包含点号,则认为是全名。比如用 "name": "org.foo.X" 表示全名org.foo.X。
  • 仅仅指定name,name中没有点号。在这种情况下命名空间取自距离最近的父亲的Schema或者protocol。比如声明了"name": "X", 这段声明在一条记录“org.foo.Y”的field中,那么X的全名就是org.foo.X。
  • 原生类型没有命名空间,并且在不可以在命名空间中定义原生类型。如果多个全名定义相等的话,一个Schema可以包含多个全名定义。




0
6
分享到:
评论

相关推荐

    kafka-schema-registry-client-6.2.2.jar

    Could not resolve dependencies for project org.apache.flink:flink-avro-confluent-registry:jar:1.15.3: Could not find artifact io.confluent:kafka-schema-registry-client:jar:6.2.2 in maven 安装本地...

    avro的avro-tools-1.8.2的jar

    这是一个关于avro的1.8.2版本的avro-tools-1.8.2的jar包

    flink-avro-1.10.0-API文档-中文版.zip

    赠送jar包:flink-avro-1.10.0.jar; 赠送原API文档:flink-avro-1.10.0-javadoc.jar; 赠送源代码:flink-avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:flink-avro-1.10.0.pom; 包含翻译后的API文档:flink-...

    avro-tools-1.8.1.jar

    avro 工具类 java -jar avro-tools-1.8.1.jar tojson --pretty test.avro > output.json

    avro-mapred-1.7.7-hadoop2.jar

    avro-mapred-1.7.7-hadoop2.jar

    parquet-avro-1.10.0-API文档-中文版.zip

    赠送jar包:parquet-avro-1.10.0.jar; 赠送原API文档:parquet-avro-1.10.0-javadoc.jar; 赠送源代码:parquet-avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:parquet-avro-1.10.0.pom; 包含翻译后的API文档...

    Python库 | avro-schema-0.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:avro-schema-0.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    avro-ipc-1.8.2-API文档-中文版.zip

    赠送jar包:avro-ipc-1.8.2.jar; 赠送原API文档:avro-ipc-1.8.2-javadoc.jar; 赠送源代码:avro-ipc-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-ipc-1.8.2.pom; 包含翻译后的API文档:avro-ipc-1.8.2-...

    avro-1.11.0-API文档-中文版.zip

    赠送jar包:avro-1.11.0.jar; 赠送原API文档:avro-1.11.0-javadoc.jar; 赠送源代码:avro-1.11.0-sources.jar; 赠送Maven依赖信息文件:avro-1.11.0.pom; 包含翻译后的API文档:avro-1.11.0-javadoc-API文档-...

    kafka-avro-serializer-5.3.2.jar

    Confluent Schema Registry 在使用java开发生产者以及消费者时的依赖包,在使用时导入到工程即可

    avro-tools-1.8.2.jar

    例如,当创建一个新的Avro数据文件时,我们需要先定义一个schema,然后使用`avro-tools compile`命令生成对应的Java类。这些类提供了序列化和反序列化的接口,使得Java程序能够方便地读写Avro数据。 此外,"avro-...

    avro-tools-1.7.6-javadoc.jar

    标签:avro-tools-1.7.6-javadoc.jar,avro,tools,1.7.6,javadoc,jar包下载,依赖包

    avro-ipc-1.7.7-API文档-中文版.zip

    赠送jar包:avro-ipc-1.7.7.jar; 赠送原API文档:avro-ipc-1.7.7-javadoc.jar; 赠送源代码:avro-ipc-1.7.7-sources.jar; 赠送Maven依赖信息文件:avro-ipc-1.7.7.pom; 包含翻译后的API文档:avro-ipc-1.7.7-...

    avro-ipc-1.7.7-API文档-中英对照版.zip

    赠送jar包:avro-ipc-1.7.7.jar; 赠送原API文档:avro-ipc-1.7.7-javadoc.jar; 赠送源代码:avro-ipc-1.7.7-sources.jar; 赠送Maven依赖信息文件:avro-ipc-1.7.7.pom; 包含翻译后的API文档:avro-ipc-1.7.7-...

    avro-1.7.4-API文档-中文版.zip

    赠送jar包:avro-1.7.4.jar; 赠送原API文档:avro-1.7.4-javadoc.jar; 赠送源代码:avro-1.7.4-sources.jar; 赠送Maven依赖信息文件:avro-1.7.4.pom; 包含翻译后的API文档:avro-1.7.4-javadoc-API文档-中文...

    avro-ipc-1.7.7.jar

    avro-ipc-1.7.7.jar

    avro-tools-1.3.0.jar.zip

    1. **Schema管理**:Avro数据依赖于schema,Avro-tools提供了对schema的操作,包括解析、比较和合并schema,这对于理解和维护复杂的Avro数据结构至关重要。 2. **数据转换**:可以将Avro数据转换为JSON格式,这对于...

    avro-tools-1.8.0.jar

    Apache Avro 是类似于 Google protobuf 那样的...对于生成的 avro 序列化文件如果要编写代码来解读其中内容的话就太过于麻烦,Apache 给了我们一个便捷的工具来处理 Avro Schema 和数据,那就是avro-tools-1.8.0.jar

    avro的avro-1.8.1的jar

    这是关于avro的avro-1.8.1版本的avro-tools的一个jar包

    avro-1.8.2-API文档-中文版.zip

    赠送jar包:avro-1.8.2.jar; 赠送原API文档:avro-1.8.2-javadoc.jar; 赠送源代码:avro-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-1.8.2.pom; 包含翻译后的API文档:avro-1.8.2-javadoc-API文档-中文...

Global site tag (gtag.js) - Google Analytics