【Avro介绍】
Apache Avro是hadoop中的一个子项目,也是一个数据序列化系统,其数据最终以二进制格式,采用行式存储的方式进行存储。
Avro提供了:
丰富的数据结构
可压缩、快速的二进制数据格式
一个用来存储持久化数据的容器文件
远程过程调用
与动态语言的简单集成,代码生成不需要读取或写入数据文件,也不需要使用或实现RPC协议。代码生成是一种可选的优化,只值得在静态类型语言中实现。
基于以上这些优点,avro在hadoop体系中被广泛使用。除此之外,在hudi、iceberg中也都有用到avro作为元数据信息的存储格式。
【schema】
Avro依赖"schema"(模式)来实现数据结构的定义,schema通过json对象来进行描述表示,具体表现为:
一个json字符串命名一个定义的类型
一个json对象,其格式为`{"type":"typeName" ...attributes...}`,其中`typeName`为原始类型名称或复杂类型名称。
一个json数组,表示嵌入类型的联合
schema中的类型由原始类型(也就是基本类型)(null、boolean、int、long、float、double、bytes和string)和复杂类型(record、enum、array、map、union和fixed)组成。
1、原始类型
原始类型包括如下几种:
null:没有值
boolean:布尔类型的值
int:32位整形
long:64位整形
float:32位浮点
double:64位浮点
bytes:8位无符号类型
string:unicode字符集序列
原始类型没有指定的属性值,原始类型的名称也就是定义的类型的名称,因此,schema中的"string"等价于{"type":"string"}。
2、复杂类型
Avro支持6种复杂类型:records、enums、arrays、maps、unions和fixed。
1)Records
reocrds使用类型名称"record",并支持以下属性
name:提供记录名称的json字符串(必选)
namespace:限定名称的json字符串
doc:一个json字符串,为用户提供该模式的说明(可选)
aliases:字符串的json数组,为该记录提供备用名称
fields:一个json数组,罗列所有字段(必选),每个字段又都是一个json对象,并包含如下属性:
name:字段的名称(必选)
doc:字段的描述(可选)
type:一个schema,定义如上
default:字段的默认值
order:指定字段如何影响记录的排序顺序,有效值为`"ascending"`(默认