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 DWSSQL ON ANYWHERE技术解密”)访问HDFSOBS上的数据。目前GaussDB(DWS)外表支持的外表格式如下表所示。新版本支持了OBSParquet文件。

文件系统

读支持

写支持

HDFS

ORCParquet

ORC

OBS

ORCCARBONDATA Parquet

ORC

2 Parquet介绍

2.1 背景与特点

  ParquetTwitterCloudera合作开发,首次发布于20137月。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 aColumn b等,每个列称为一个Column ChunkColumn Chunk内部以Page为单位存储数据。例如某个表中有N列、MRow 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) metadataPage header metadata。各类型元数据如下图所示(引自官网)。读取Parquet文件应当从文件级元数据开始解析,依次获取目标RowGroupColum Chunk的偏移量信息,然后按顺序读取。下面分析一下Parquet源码读取Parquet文件的过程。

3.1 File metadata

  Parquet源码中File metadata解析过程如下:

1)获取文件大小file_size,若file_size小于8则报错。

2)从文件末尾开始读取kDefaultFooterReadSize64K)大小的内容,若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解析

  PagePage headerRepetition levelDefinition levelValues组成。Repetition levelDefinition level用于支持嵌套结构。Parquet包含三种类型的PageData PageIndex PageDictionary PageData Page用于存储当前Colum Chunk中该列的值,Dictionary Page存储该列值的编码字典,每一个Colum Chunk中最多包含一个Dictionary PageIndex 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个月内不可修改。