码迷,mamicode.com
首页 > 其他好文 > 详细

列式存储 Parquet

时间:2015-10-16 13:43:34      阅读:674      评论:0      收藏:0      [点我收藏+]

标签:

    1.  最初创建Parquet的目的是:要在Hadoop生态系统中,充分利用数据压缩、有效列式存储的优势。Parquet面向复杂的嵌套数据结构,使用Dremel中的record shredding and assembly算法,其与简单命名空间嵌套的方法相比更加高效。Parquet支持有效的数据压缩和编码方式,甚至允许为不同列单独设置压缩方式。

    2. 名词术语:block(数据块)、file(文件)、column chunk(列块):将数据按列存储时,每一列数据被分割成多个列块、row group(行组):每一列一个列块组合起来就构成行组、page(页):每一个列块被分割成很多页,页是压缩和编码的最小单元。分层次来看,Parquet中的一个文件包含一个或者多个行组,一个行组包含多个列块且每一列仅对应一个列块,每个列块包含一个或者多个页。

    3. 元数据(metadata):Parquet包括3种类型的元数据,文件元数据、列块元数据和页元数据。

    Parquet支持的原始数据类型有:1个bit的BOOLEAN、32个bit的INT32、64个bit的INT64、96个bit的INT96、32个bit的FLOAT、64个bit的DOUBLE、任意长度的字节数组BYTE_ARRAY。为了拓展原始数据类型,Parquet引入了逻辑类型,指定原始数据类型的解读方式。例如:字符串被保存为一个包含UTF8编码注解(annotation)的字节数组,注解定义了如何解读保存成原始数据类型的数据。注解在文件元数据中,被保存为一个ConvertedType类型的对象,在文档LogicalTypes.md中有逻辑类型注解的说明。

    为了编码嵌套的列,Parquet引入了Dremel编码机制:加入了列定义深度以及列重复元素深度的概念。列定义深度指定到当前列元素的字段路径中,有值的可选(optional)字段的数量;列重复元素深度记录该重复出现的列元素的深度。从记录的数据中,可以计算出最大列定义深度和最大列重复元素深度。

    空值被编码在列定义深度中,不会额外的存储空值。

    

列式存储 Parquet

标签:

原文地址:http://my.oschina.net/jhone/blog/517918

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!