简介
Apache Parquet 是一种能够有效存储嵌套数据的列存储格式。(列式存储格式在文件大小和查询性能上表现优秀) Parquet 的突出贡献在于能够以真正的列式存储格式来保存具有深度嵌套结构的数据。 参考博客-简书
数据模型
原子类型
类型
描述
boolean
二进制值
int32
32位有符号整数
int64
64位有符号整数
int96
96位有符号整数
float
(32位)IEEE754单精度浮点数
double
(64位)IEEE754单精度浮点数
binary
8位无符号字节序列
fixed_len_byte_array
固定数量的8位无符号字节
一个简单的Parquet模式:
message WeatherRecord{
required int32 year;
required int32 temperature;
required binary stationId (UTF-8);
}
parquet 的原子类型不包括字符串类型。required binary stationId (UTF-8); 表示字符串
逻辑类型
逻辑类型注解 | 描述 | 模式示例 |
---|---|---|
UTF-8 | 由UTF-8字符组成的字符串,可用于 注解binary | message m { required binary a (UTF-8); } |
ENUM | 命名值的集合,可用于binary | message m { required binary a (ENUM); } |
DECIMAL (precision,scale) | 任意精度的有符号小数,可用于注解 int32、int64、binary或fixed_len_byte_array | message m { required int32 a (DECIMAL(5,2)); } |
DATE | 不带时间的日期值,可用于注解int32. 用Unix元年(1970年1月1日)以来的天 数表示 | message m { required int32 a (DATE); } |
LIST | 一组有序的值,可用于注解group | message m { required group a (LIST){ required group list{ required int32 element; } } } |
MAP | 一组无序的键-值对,可用于注解group | message m { required group a (MAP){ required group key_value{ required binary key (UTF-8); optional int32 value; } } } |
Parquet文件格式
Paruet文件由一个文件头,一个或多个紧随其后的文件块,以及一个用于结尾的文件尾构成。文件头中仅包含一个称为PAR1的4个字节数字,它用来识别整个Parquet文件格式。文件的所有元数据都被保存在文件尾中。
Parquet的配置
在设置文件块的大小时需要折中考虑扫描率与内存的使用。较大的文件块包含较多的行,因此扫描效率更高。同时也可以提高顺序I/O操作的效率(因为在设置列块时的额外开销比较少)。但是,每个文件块在读/写操作时都需要缓存在内存中,这个限制使得文件块不能太大。默认的文件块为128MB.