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