Introduction

    此文档定义了Apache Avro,它是权威的指南,Avro的实现必须遵循此文档。


Schema Declaration

    schema是以Json的形式展现,存在以下几种形式:


    1)Json字符串,命名为以定义类型。


    2)Json对象,形式:{"type": "typeName" ...attributes...},typename要么是原始类型或派生类型。在文档中为定义的attribute可以作为元数据,但不能影响序列化数据的格式。


    3)Json数组,代表了内嵌类型的联合体


Primitive types

    基础数据类型如下:


    1)null:无指


    2)boolean:二进制值


    3)int:32位有符号整数


    4)long:64位有符号整数


    5)float:单精度(32位)浮点数


    6)double:双精度(64位)浮点数


    7)bytes:8位bit字节序列


    8)string:unicode字符序列


    基本类型没有指定的属性,{"type":"string"}


Complex Types

    avro支持六种复杂类型:records,enums,arrays,maps,unions和fixed。

record

records:使用name为"record",支持三种属性。


        1)name:json字符串,提供record的名称


        2)namespace:name的全名。


        3)doc:此schema的描述


        4)aliases:json的字符串数组,name的替代值。


        5)fields:json数组,filed列表,每一个filed是一个json对象,其属性如下:


           1)name:json字符串


           2)doc:field的描述


           3)type:json对象的定义schema。


           4)default:此filed的默认值


           5)order:指定此record中filed的压缩排序顺序。有效值为ascending descending ignore

{
  "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

    枚举使用类型名称为"enum",支持一下属性:


    1)name:json字符串


    2)namespace:全名


    3)aliases:json字符串数组,别名


    4)doc:此schema的描述


    5)symbols:json数组,symbols列表


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

Arrays

    使用type的名称为array,支持单个属性。items:数组元素的schema。


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

Maps

   使用type的名称为map,支持一个属性。values:map的value的schema。map的keys设定为字符串。


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


Unions

   Union使用json数组代表,如["string","null"],声明schema要么是null要么是null。对于同一个类型,union不会包含多于一个的schema。


Fixed

   支持两个属性。


   1)name,此filed的名称 


   2)namespace:全名


   3)aliases:别名,json字符串数组


   4)size:integer,每个值的字节数


{"type": "fixed", "size": 16, "name": "md5"}

Data Serialization

    avro data序列化伴随着schema。存储Avro数据的文件也包括此数据的schema。Avro的RPC系统必须保证远程数据接受者写数据时有schema的备份。因为当数据读取时,写入数据的schema通常是可获取的,所以Avro数据本身并不包含类型信息。一般来说,序列化和反序列化的过程是:深度优先,由左至右遍历schema。


Encodings


    avro提供了两种学裂化编码方式:二进制和Json。大多数使用二进制编码,因为小巧,快速。基于调试和web的application,Json编码会更加合适。


Binary Encoding