Avro 数据格式和命令行介绍
支持的原始类型: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":"属性默认值"
markdown_img_paste_20181103110442275
- 案例
{
"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类型,这是不允许的。
组合类型不允许嵌套组合类型。
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