GaussDB(DWS)外表列存格式介绍之Parquet

举报
tooooooooooomy 发表于 2021/09/27 10:24:18 2021/09/27
【摘要】 1 GaussDB(DWS)外表支持的列存格式  GaussDB(DWS)通过SQL On Anywhere特性(参考博客“GaussDB DWS的SQL ON ANYWHERE技术解密”)访问HDFS或OBS上的数据。目前GaussDB(DWS)外表支持的外表格式如下表所示。新版本支持了OBS读Parquet文件。文件系统读支持写支持HDFSORC、ParquetORCOBSORC、CAR...

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级数仓黑科技,后台还可获取众多学习资料哦

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。