$ avro格式规范1.8.1翻译

$ Schema声明

schema有以下几种json格式:

  • 一个已定义类型名的json字符串

  • json对象:

    {"type": "typeName" ...attributes...}
    

    typeName是一个基本类型名或者派生类型名,本文档没有定义允许的属性。

  • 一个json数组,表示一个内置类型的组合。

$ 基本类型

基本类型名包括:

  • null: 没有值
  • boolean: 一个二进制的值
  • int: 32位有符号整型
  • long: 64位有符号整型
  • 单精度IEEE754浮点型数字
  • 双精度IEEE754浮点型数字
  • bytes: 8位无符号字节序列
  • string: unicode字符序列

基本类型没有特定的属性,基本类型名也是已定义的类型名。因此"string"也等同于:

{"type": "string"}

$ 复杂类型

avro支持六种复杂类型:records, enums, arrays, maps, unions 以及 fixed.

$ records

records使用类型名"record",支持下面几种属性:

  • name:一个json字符串定义了记录的名字(必要)

  • namespace,一个json字符串,限定了name的命名空间

  • doc: 一个json字符串,为用户提供文档信息(可选)

  • aliases: 一个json数组,提供此记录的别名(可选)

  • 一个包含field列表的json数组(必需的),每个field是有下面属性的json对象:

    • name:一个json字符串定义了field的名字(必要)

    • doc: 一个json字符串,为用户描述了此field(可选)

    • type: 一个定义schema的json对象,或者一个已定义record的json字符串(必要)。

    • default:

      此field的默认值(可选),根据schema类型的不同允许的值也不同。union类型field的默认值与union中第一个schema相对应。bytes和fixed类型field的默认值是json字符串,Unicode 0-255代码点映射成无符号8位字节。

      avro type json type example
      null null null
      boolean boolean true
      int,long integer 1
      float,double number 1.1
      bytes string "\u00FF"
      string string "foo"
      record object {"a": 1}
      enum string "FOO"
      array array [1]
      map object {"a": 1}
      fixed string "\u00ff"
    • order: 指定此字段如何影响record的排序,有效的值包括"ascending" (默认), "descending", or "ignore".

    • aliases: 一个json数组,提供此记录的别名(可选)

例如一个64位的链表可以这样定义:

{
  "type": "record",
  "name": "LongList",
  "aliases": ["LinkedLongs"],                      // old name for this
  "fields" : [
    {"name": "value", "type": "long"},             // each element has a long
    {"name": "next", "type": ["null", "LongList"]} // optional next element
  ]
}

$ 枚举

枚举的类型名是"enum",支持下面的属性:

  • name:一个json字符串定义了枚举的名字(必要)
  • namespace,一个json字符串,限定了name的命名空间
  • aliases: 一个json数组,提供此枚举的别名(可选)
  • doc: 一个json字符串,为用户提供文档信息(可选)
  • symbols: a JSON array, listing symbols, as JSON strings (required). All symbols in an enum must be unique; duplicates are prohibited. Every symbol must match the regular expression [A-Za-z_][A-Za-z0-9_]* (the same requirement as for names (opens new window)).一个json数组,以json字符串形式列出所有的symbols(必要)。同一个枚举中的symbol必须唯一,每个symbol必须匹配正则表达式[A-Za-z_][A-Za-z0-9_]*

例如扑克牌可以这样定义:

{ "type": "enum",
  "name": "Suit",
  "symbols" : ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]
}

$ 数组

数组的类型名是"array",只支持一个属性:

  • items: 元素的schema

例如字符串数组声明如下:

{"type": "array", "items": "string"}

$ Maps

数组的类型名是"map",只支持一个属性:

  • values: 值的schema

map的key类型指定为字符串

例如,字符串到long的map:

{"type": "map", "values": "long"}

$ Unions

union使用json数组来表示。例如["null", "string"]的类型要么是null,要么是string。

union类型field的默认值与union中第一个schema相对应。因此对于包含null的union通常是第一个,因为这样union的默认值通常是null。

除了record,fixed和enum,union类型只能包含一个同一种类型的schema。例如,不允许union里包含两个数组类型或者两个map类型,但是不同名字的可以。union不能包含其他union。

$ Fixed

Fixed的类型名是"fixed",支持两个属性:

  • name: fixed的名称(必要)
  • namespace,一个json字符串,限定了name的命名空间
  • aliases: 一个json数组,提供此枚举的别名(可选)
  • size:一个整型,指定了每个值的字节数(必要)

例如,16位fixed这样定义:

{"type": "fixed", "size": 16, "name": "md5"}
更新时间: 8/29/2020, 2:45:20 AM