常见的文件存储格式有行式存储,列式存储和混合式存储。在大数据系统中,列式存储和混合式存储更常见。对于HDFS这样的文件存储系统来说,其实并不关心存储的是什么形式的存储文件。只是在解析数据时,需要知道是什么类型的文件。例如Hive对RCFile和ORCFile的支持就在于,Hive知道这两种文件中数据的存储方式,并正确地解析数据并查询。
1,行式存储
广泛使用于主流关系型数据库及HDFS中。优势是当需要按行遍历时效率很高。缺点是当不需要所有字段时也需要读取所有字段,浪费IO和内存,以及整行压缩效率较低。
行式存储很像是按序在磁盘写入数据流,达到数据页面上限时开始写入下个数据页面。为了表达数据的前后关系,数据页面之间用指针相连。常见的csv就可以认为时是种行式存储。
2,列式存储
简单的列式存储是将数据按所有列进行垂直划分,每一列数据连续存储在一起。当需要所有列时,使用指针将不同的列拼合在一起。这样做解决了行式存储的问题,但其缺点也很明显:典型的MR经常需要遍历数据,且block经常存储在不同的node上,因此拼合会导致大量的网络传输。实际中更多使用的是column-family,即将几个经常同时使用的列分为一组并连续存储,成为一个colmun-family;一行数据被拆分成少量的几个column-family。
Redshift采用column storage,即简单的列式存储。HBase底层的HDFS采用column-family存储。
3,混合存储
column-family还是会导致一些网络传输,而混合式存储则能更好的处理这个问题。混合式存储首先将记录表按照行进行分组,若干行划分为一组(row group)。而对于每组内的所有记录,在实际存储时将同一列内容连续存储在一起。这