首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Avro 1.2.0 轨范

2012-10-26 
Avro 1.2.0 规范Avro 1.2.0 规范(本文翻译自:http://hadoop.apache.org/avro/docs/current/spec.html 不足

Avro 1.2.0 规范

Avro 1.2.0 规范

(本文翻译自:http://hadoop.apache.org/avro/docs/current/spec.html 不足之处请指出)

介绍attributes...}。其中,typeName 是一个基本或者派生的类型名,稍后会给出定义。本文中未定义的属性可以作为元数据,但是不能影响序列化数据的结构。一个 JSON 数组,表示内嵌类型的联合。
基本类型基本类型的集合为:
{"name": "value", "type": "long"}, // each element has a long
{"name": "next", "type": ["LongList", "null"]} // optional next element
]
}
枚举
枚举以 “enum” 作为类型名,支持以下属性:
}
数组
数组以 "array" 为类型名,支持单个属性:
values:map values 的模式。映射的 keys 假定为字符串。
例如,一个从字符串到 long 的映射声明为:
?{"type": "map", "values": "long"}
联合

在之前提到过联合以 JSON 的数组表示。例如,["string","null"] 声明了一种模式,可以为字符串或者 null。

除了记录,固定和枚举,联合可以包含不超过一个拥有相同类型的模式。例如,不允许联合包含两个数组类型或者两个映射类型类型,但是允许两个不同名称的类型。(Names permit efficient resolution when reading and writing unions.)

联合不可以包含其他的联合

FixedFixed 以 "fixed" 作为类型名,支持两种属性:
name:fixed 的名称(必需)。size:一个整数,指定了每一个值的字节数(必需)。比如,16-byte 的 fixed 可以声明为:
bytes 被编码为一个长整型紧接 bytes 数据。int 和 long 被编码为变长的 zig-zag 编码。以下为一些例子:
valuehex {"name": "a", "type": "long"},
{"name": "b", "type": "string"}
]
}
它的一个实例的的 a 域的值为 27(编码为 hex 36),b 域的值为 "foo"(编码为hex 0c 66 6f 6f),它的编码就是这两个域的编码的连接,也就是十六进制的字符序列:36 0C 66 6f 6f
枚举

枚举以整型编码,表示模式中从零开始的位置。例如,enum:

{"type": "enum", "name": "Foo", "symbols": ["A", "B", "C", "D"] }

被编码为 0-3 之间的一个整型值,0 表示 "A",3 表示 "D"。

数组

数组被编码为一系列的块。每一个块包含一个长整型的 count 值,紧跟数组条目。一个 count 值为 0 的块表示了数组的结束。数组中的每一个条目按照自己的模式编码。

如果一个块的 count 值为负,那么 count 值紧跟一个长整型的值,表示 block中的字节数目。在这种情况下,实际的count值是写入的count值的绝对值(译者注:这段话有点拗口,原文为:If a block'scount is negative, then the count is followed immediately by a Fixed

Fixed 实例的编码方法为直接使用模式中定义的字节数。

"response": "Greeting",
"errors": ["Curse"]
}
}
}

线上协议格式

一个 Avro 数据的读者,不管是从RPC还是文件读,因为总可以获得模式,所以都可以解析数据。但是模式有可能不是想要的。例如,如果读数据和写数据的程序不是同一个版本,记录中增加或者删除了某些域。本小节指出了如何解决不同的模式。

?

我们把写数据的时候用到的模式称为写模式,应用所期望模式读模式。它们之间的不同为:

如果两种模式不匹配,则出现错误。
为了匹配,其中的一种必须包含:两种模式都是数组,它们的项目类型匹配。两种模式都是映射,它们的值类型匹配。两种模式都是枚举,它们的名称匹配。两种模式都是固定,它们的大小和名称匹配。两种模式都是记录,它们的名称相同。其中的一种模式是联合。两种模式都有相同的基本类型。如果按照以下步骤,写模式可以提升为读模式:int 提升为 long,float 或者 double。long 提升为 float 或者 double。float 提升为 double。
如果两种模式都是记录域的顺序可以不一样,只要域的名字都一样。两个记录中模式的域会被递归的解析。如果写记录中包含读记录中没有的域,写记录中的相应域的值被忽略。如果写记录中包含一个有默认值的域,而写记录中没有相应的域,则读记录使用相应的默认值。如果写记录中有一个没有默认值的域,二度记录中没有相应的域,则域值为不确定。
如果两种都是枚举:
如果写者的符号并没有出现在读者枚举中,枚举的值为不确定。如果两种都是数组:
解析算法对读者和写者的数组项目的模式进行递归解析。
如果两种都是映射:
解析算法对读者和写者的值的模式进行递归解析。
如果两种都是联合:
读者联合的第一个匹配写者联合中选定的模式被递归的解析。如果没有匹配,发出错误信号。

如果读者是一个联合,但是写者不是:
读者联合中的第一个匹配写者联合模式的模式被递归的解析。如果没有匹配,发出错误信号。

如果写者是一个联合,二读者不是
如果读者模式匹配选定的写着模式,则递归解析。如果没有匹配,发出错误信号。


1 楼 langyu 2010-06-24   正在看这个原文文档,看的好累。感觉这个文档写的一般

热点排行