高性能列式存储 | 青训营笔记

128 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

1 列存储和行存储

  • OLTP与OLAP

image.png

行存储列存储
优点写入效率高,保证数据完整性读取效率高,没有冗余
缺点数据有冗余现象,计算速度慢写入次数多,速度慢,消耗cpu
使用场景关注整张表内容,或者需要经常更新数据、需要经常读取整行数据、不需要聚集运算,或者快速查询需求、数据表本身数据行并不多经常关注一张表某几列而非整表数据的时候、基于一列或比较少的列计算的时候、数据表拥有非常多的列的时候、数据表有非常多行数据并且需要聚集运算的时候、数据表列里有非常多的重复数据,有利于高度压缩

列存查询速率优于行存原理分析: 传统的存储数据的方式是逐行存储(Row Store),每一个Page存储多行数据,而列存储(Column Store)把数据表中的每一列单独存储在Page集合中,这意味着,Page集合中存储的是某一列的数据,而不是一行的所有列的数据。

列存储索引适合于数据仓库中,主要执行大容量数据加载和只读查询,与传统面向行的存储方式相比,使用列存储索引存储可最多提高 10 倍查询性能 ,与使用非压缩数据大小相比,可提供多达 7 倍数据压缩率 。列存储索引使用用“批处理执行模式”的模式,这与行存储使用的逐行数据读取模式对比,性能大幅提升。

image.png

2 Parquet

一个Parquet文件的内容有HeaderData BlockFooter三部分组成。 Header:在文件的首尾各有一个内容为PAR1的Magic Number,用于标识这个文件为Parquet文件。Header部分就是开头的Magic Number。 Data Block:Data Block是具体存放数据的区域,由多个Row Group(行组)组成,每个Row Group包含了一批数据。比如,假设一个文件有1000行数据,按照相应大小切分成了两个Row Group,每个拥有500行数据。每个Row Group中,数据按列汇集存放,每列的所有数据组合成一个Column Chunk(列块),一个列块具有相同的数据类型,不同的列块可以使用不同的压缩。因此一个Row Group由多个Column Chunk组成,Column Chunk的个数等于列数。每个Column Chunk中,数据按照Page为最小单元来存储,根据内容分为Data PageIndex Page

3 压缩 Compression

image.png

4 ORC

(1)stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为HDFS的块大小,保存了每一列的索引和数据。

(2)Index Data:存数据的一些统计信息和位置索引信息。

(3)Row Data:数据存储的地方,有多个行组组成。

(4)Stripe Footer:保存文件所在的文目录。

(5)File Footer:文件脚注,包含了文件中stripe的列表,每个stripe的行数和行的数据类型,以及每列的最值和聚合信息。

(6)Poststripe:包含压缩参数大小相关的信息。

5 ORC和Parquest对比

image.png