摘要
Schema究竟是什么,Avro和JSON的关系,Avro的序列化与反序列化,对象容器文件。
Schema究竟是什么?
从Apache Avro简介中并不能确切的理解schema究竟是什么。通过阅读官方文档,总结如下:
schema是一种metadata(元数据,是用于描述数据的数据),用于描述avro数据;
-
schema通过JSON定义,下面是一个record类型的schema:
{ "type": "record", "name": "test", "fields" : [ {"name": "a", "type": "long"}, {"name": "b", "type": "string"} ] }
-
解析avro数据(来自对象容器文件或序列化数据)时,必须根据数据的schema进行分析;
通常,schema和其描述的数据一起存放,例如:在avro支持的对象容器文件(Object Container File)中就在头部包含了文件中存储的数据的schema;在RPC应用中,通信双方也必须确保拥有对方所发送数据的schema。
Avro与JSON的类型映射
Avro数据的序列化和反序列化
Avro指定两种序列化方法:
- 二进制:更小、更快,用于大部分应用中;
- JSON:易读,常用于调试和基于web的应用中;
序列化原则:深度优先、从左到右。
序列化之后的数据,可以通过反序列化而得到原数据(首先获取schema是必须的)。
对象容器文件(Object Container File)
对象容器文件是avro定义的一种文件格式。包含如下内容:
- Four bytes, ASCII 'O', 'b', 'j', followed by 1.
- file metadata, including the schema.
- The 16-byte, randomly-generated sync marker for this file.
- one or more file data blocks.
注意:
- 文件中存储的所有数据必须对应于头部的schema(avro.schema);
- 所有数据必须采用二进制序列化;
- 存储的数据可以压缩(deflate),也可以不压缩(null);
JSON与Avro可以互转吗?
可以!参考序列化和反序列化。