列存储和行式存储的比较
列存储和传统的行式存储,在存储介质中的排列方式如图所示。这种存储方式也就决定了他们的适用场景。需要事务处理
行存储更适用于OLTP(on-line transaction processing)的场景,在这种场景中,大部分情况下需要存储数据的全量或者一大部分字段,并且需要支持频率不低的更新和插入操作。
而最近火起来的大数据的要求却于此大相径庭,这种场景通常被称为OLAP(On-Line Analytical Processing)。在这种场景中查询可能需要访问几百万甚至几十亿个数据行,且该查询往往只关心少数几个数据列。例如,查询今年销量最高的前20个商品,这个查询只关心三个数据列:时间(date)、商品(item)以及销售量(sales amount)。商品的其他数据列,例如商品URL、商品描述、商品所属店铺,等等,对这个查询都是没有意义的。并且由于需要数据分析,因此需要大量的聚合等复杂操作。这种情况下,列存储就非常适用。
其优缺点总结如下
|
|
行式存储 |
列式存储 |
|
优点 |
Ø 数据被保存在一起 |
Ø 查询时只有涉及到的列会被读取 |
|
缺点 |
Ø 选择(Selection)时即使只涉及某几列,所有数据也都会被读取 |
Ø 选择完成时,被选择的列要重新组装 |
另外因为一列的数据大多数都是同构的,因此可以使用更高效的压缩算法来进行数据压缩。
可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。
压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Encoding)进一步节约存储空间。
只读取需要的列,支持向量运算,能够获取更好的扫描性能。
什么是Parquet文件
parquet是一种支持复杂嵌套结构的列存储格式。
http://blog.csdn.net/yu616568/article/details/50993491
http://www.infoq.com/cn/articles/in-depth-analysis-of-parquet-column-storage-format