GaussDB(DWS)外表列存格式介绍之Parquet
1 GaussDB(DWS)外表支持的列存格式
GaussDB(DWS)通过SQL On Anywhere特性(参考博客“GaussDB DWS的SQL ON ANYWHERE技术解密”)访问HDFS或OBS上的数据。目前GaussDB(DWS)外表支持的外表格式如下表所示。新版本支持了OBS读Parquet文件。
文件系统 |
读支持 |
写支持 |
HDFS |
ORC、Parquet |
ORC |
OBS |
ORC、CARBONDATA 、Parquet |
ORC |
2 Parquet介绍
2.1 背景与特点
Parquet由Twitter和Cloudera合作开发,首次发布于2013年7月。Parquet使用记录分解和组装算法,支持嵌套结构,具有高效的压缩性能,兼容MapReduce, Spark, Cascading, Crunch, Scalding, Kite等计算框架。
2.2 Parquet文件格式
Parquet文件格式如下图(引自官网:https://parquet.apache.org/documentation/latest/)。一个完整的Parquet文件包含开头和结尾各4字节的“Magic Number”、若干数据主体“Row group”和文件级元数据“Footer”,除此之外在结尾的Magic Number之前有4个字节用于标识Footer长度。
文件按固定的行数分为若干Row group,每个Row group内部按不同的列依次排开,即Column a、Column b等,每个列称为一个Column Chunk。Column Chunk内部以Page为单位存储数据。例如某个表中有N列、M个Row group,整个表的存储方式如下所示。
4-byte magic number "PAR1" <Column 1 Chunk 1 + Column Metadata> <Column 2 Chunk 1 + Column Metadata> ... <Column N Chunk 1 + Column Metadata> <Column 1 Chunk 2 + Column Metadata> <Column 2 Chunk 2 + Column Metadata> ... <Column N Chunk 2 + Column Metadata> ... <Column 1 Chunk M + Column Metadata> <Column 2 Chunk M + Column Metadata> ... <Column N Chunk M + Column Metadata> File Metadata 4-byte length in bytes of file metadata 4-byte magic number "PAR1" |
3 Parquet文件读取过程解析
Parquet有三种类型的元数据:File metadata, Column (chunk) metadata和Page header metadata。各类型元数据如下图所示(引自官网)。读取Parquet文件应当从文件级元数据开始解析,依次获取目标RowGroup、Colum Chunk的偏移量信息,然后按顺序读取。下面分析一下Parquet源码读取Parquet文件的过程。
3.1 File metadata
Parquet源码中File metadata解析过程如下:
(1)获取文件大小file_size,若file_size小于8则报错。
(2)从文件末尾开始读取kDefaultFooterReadSize(64K)大小的内容,若file_size小于64K则读取file_size大小的文件内容。
(3)检查Magic Number,获取Footer长度信息。
(4)依据Footer长度读取Footer内容。
(5)对Footer进行反序列化,生成结构化的元数据信息。用于文件查询。
3.2 ColumChunk metadata
在获取了结构化的File metadata之后,依据索引i生成并获取目标RowGroup 的metadata。再依据列索引j获取相应的ColumChunk metadata。自此Footer中的内容已经解析到了最低层次,可以根据ColumChunk metadata获取各Colum Chunk的编码、压缩、Page偏移等信息。
3.3 Page解析
Page由Page header、Repetition level、Definition level和Values组成。Repetition level、Definition level用于支持嵌套结构。Parquet包含三种类型的Page:Data Page、Index Page和Dictionary Page。Data Page用于存储当前Colum Chunk中该列的值,Dictionary Page存储该列值的编码字典,每一个Colum Chunk中最多包含一个Dictionary Page,Index Page用来存储当前Colum Chunk下该列的索引。Dictionary Page必须在Data Page之前。
Page header默认大小为16KB,最大16MB,通过读取Page header获取当前Page的编码类型、统计信息等,用于Page数据的解码和读取。
4 GaussDB(DWS)对Parquet后续支持
目前GaussDB(DWS)对Parquet主要在访问性能上展开优化,后续将考虑支持在文件系统上的写功能。
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦
- 点赞
- 收藏
- 关注作者
评论(0)