Avro 資料格式和命令列
阿新 • • 發佈:2019-01-07
- 支援的原始型別:null,boolean,int,long,float,double,bytes,string
-
支援的複雜型別:
-
records
- 必須:"type":"record"
- 必須:"name":"記錄名"
- "namespace":"包名"
- "doc":"為schema提供文件"
- "aliases":"json的一個string陣列,為這條記錄提供別名"
-
必須:"fields":"json陣列,列舉所有屬性,每個fields都是一個json物件幷包含如下屬性"
- 必須:"name":"屬性名"
- 必須:"type":"屬性型別"
- "doc":"屬性文件"
- "order":"預設升序"
- "default":"屬性預設值"
-
- 案例
{ "namespace": "example.avro", "type": "record", "name": "User", "fields": [ {"name": "name", "type": "string"}, {"name": "favorite_number", "type": ["int", "null"]}, {"name": "favorite_color", "type": ["string", "null"]} ] }
-
enums
- 必須:"type":"enum"
- 必須:"name":"enum名"
- "namespace":"限定和修飾name屬性,包名"
- 必須:"symbols":"string陣列,列舉所有列舉"
- "aliases":"string陣列,為enum提供別名"
- "doc":"為此schema提供文件"
{ "type": "enum", "name": "Suit", "symbols": [ "SPADES", "HEARTS", "DIAMONDS", "CLUBS" ] }
-
arrays
- 必須:"items":"array中元素的Schema"
{ "type": "record", "name": "ArrAvro", "fields" : [ {"name": "arr", "type": ["null",{"type":"array", "items":"string"}]} ] } 編譯後是: @Deprecated public java.util.List<java.lang.CharSequence> arr;
-
maps
- 必須:"values":"定義map的值的Schema,Maps的key都是string"
- Map定義為
{ "type": "record", "name": "MapAvro", "fields": [ { "name": "map", "type": [ "null", { "type": "map", "values": "long" } ] } ] } 編譯後: @Deprecated public java.util.Map<java.lang.CharSequence,java.lang.Long> map
-
unions
- Unions就像JSON的陣列表示:
["string", "null"]
,聲明瞭一個union的Schema,其元素即可以是string,也可以是null。 - Unions不能包含多個相同型別的Schema,除非是命名的record型別、命名的fixed型別和命名的enum型別。比如,如果unions中包含兩個array型別,或者包含兩個map型別都不允許;但是兩個具有不同name的相同型別卻可以。由此可見,union是通過Schema的name來區分元素Schema的,因為array和map沒有name屬性,當然只能存在一個array或者map。(使用name作為解析的原因是這樣做會使得讀寫unions更加高效)。unions不能緊接著包含其他的union。
- 組合型別,表示各種型別的組合,使用陣列進行組合。比如[“null”, “string”]表示型別可以為null或者string。
- 組合型別的預設值是看組合型別的第一個元素,因此如果一個組合型別包括null型別,那麼null型別一般都會放在第一個位置,這樣子的話這個組合型別的預設值就是null。
- 組合型別中不允許同一種類型的元素的個數不會超過1個,除了record,fixed和enum。比如組合類中有2個array型別或者2個map型別,這是不允許的。
- 組合型別不允許巢狀組合型別。
- Unions就像JSON的陣列表示:
-
fixed.
- 必須:"name":"名字"
- "namespace":"包名"
- "aliases":"別名"
- 必須:"size":"一個整數,表示每個值的位元組數"
- 比如16位元組的fixed可以宣告為:
{"type": "fixed", "size": 16, "name": "md5"}
-
avro命令
- 使用avro工具將json檔案轉換成avro檔案:
java -jar avro-tools-1.8.0.jar fromjson --schema-file user.avsc user.json > user.avro
- 可以設定壓縮格式:
java -jar avro-tools-1.8.0.jar fromjson --codec snappy --schema-file user.avsc user.json > user2.avro
- 將avro檔案反轉換成json檔案:
java -jar avro-tools-1.8.0.jar tojson user.avro java -jar avro-tools-1.8.0.jar --pretty tojson user.avro
-
得到avro檔案的meta:
java -jar avro-tools-1.8.0.jar getmeta user.avro
- 輸出:
avro.codec null avro.schema {"type":"record","name":"User","namespace":"example.avro","fields":[{"name":"name","type":"string"},{"name":"favorite_number","type":"int"},{"name":"favorite_color","type":"string"}]}
- 得到avro檔案的schema:
java -jar avro-tools-1.8.0.jar getschema user.avro
- 將文字檔案轉換成avro檔案:
java -jar avro-tools-1.8.0.jar fromtext user.txt usertxt.avro
- 使用avro工具將json檔案轉換成avro檔案: