摘要
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可以互轉嗎?
可以!參考序列化和反序列化。