文件存储格式
- 引言
- 1、TextFile
- 2、sequencefile
- 3、orc
- 4、 parquet
- 5、性能比较
引言
Hive支持的存储数的格式主要有:TextFile、SEQUENCEFILE、ORC、PARQUET。其中,TEXTFILE、SEQUENCEFILE是基于行存储,ORC、PARQUET基于列存储。
行存储和列存储
- 上图中左边为逻辑表,右上为行存储,右下为列存储。
- 行存储特点:查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。
- 列存储特点:查询满足条件的一整列数据的时候,行存储则需要去每个聚集的字段找到对应的每个行的值,列存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。另一方面,每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。
- 当查询结果为一整行的时候,行存储效率会高一些;当查询表中某几列时,列存储的效率会更高。
- 在对数据的压缩方面,列存储比行存储更有优势,所以列存储占用空间相对小一些。
1、TextFile
- 默认的文件格式,行存储。建表时不指定存储格式即为textfile,导入数据时把数据文件拷贝至hdfs不进行处理
- 优点:最简单的数据格式,便于和其他工具(Pig, grep, sed, awk)共享数据,便于查看和编辑;加载较快
- 缺点:耗费存储空间,I/O性能较低;Hive不进行数据切分合并,不能进行并行操作,查询效率低
- 应用场景:适用于小型查询,查看具体数据内容的测试操作
2、sequencefile
- 含有键值对的二进制文件,行存储
- 优点:可压缩、可分割,优化磁盘利用率和I/O;可并行操作数据,查询效率高
- 缺点:存储空间消耗最大;对于Hadoop生态系统之外的工具不适用,需要通过text文件转化加载
- 应用场景:适用于数据量较小、大部分列的查询。
3、orc
ORC文件由stripe、file footer、postscript三部分组成:
3.1 Stripe
一个ORC文件,可以包含多个Stripe,Stripe默认大小250M。
Stripe由Index Data、Row Data、Stripe Footer三部分组成:
- Index Data
轻量级索引,默认每隔1w行做一个索引,目的是记录某行的各个字段在Row Data中的偏移量,保存了该stripe上数据的位置信息,总行数等信息。 - Row Data
真正存储数据的部分,对每个列进行编码存储。 - Stripe Footer
存储stripe的元数据信息。
3.2 File Footer
每个ORC文件中存有一个file footer,里面记录了各个stripe存储的行数,每个列的数据类型等信息。
3.3 Postscript
Postscript在ORC文件的尾部,记录了整个文件的压缩类型、File Footer的长度信息等。ORC文件是从后往前读的,先读取Postscript,获取File Footer的信息,再从File Footer里读取Stripe的信息,最后定位到需要读取的数据。
- 存储方式:数据按行分块,每块按照列存储,所有列存在一个文件中。
- 优点:压缩快 快速列存取;效率比rcfile高,是rcfile的改良版本。
- 缺点:存储空间消耗最大;对于Hadoop生态系统之外的工具不适用,需要通过text文件转化加载
- 应用场景:适用于Hive中大型的存储、查询。
4、 parquet
- parquet类似于orc,相对于orc文件格式,hadoop生态系统中大部分工程都支持parquet文件。
- 存储模式:按列存储,Parquet文件是以二进制方式存储的,不可以直接读取和修改的,文件是自解析的,文件中包括该文件的数据和元数据
- 存储结构:
- 行组(Row Group):按照行将数据物理上划分为多个单元,每一个行组包含一定的行数,在一个HDFS文件中至少存储一个行组,Parquet读写的时候会将整个行组缓存在内存中,所以如果每一个行组的大小是由内存大的小决定的
- 优点: Parquet能够很好的压缩和编码,有很好的查询性能,支持有限的模式演进。
- 缺点:写速度通常比较慢,不支持update、insert、delete、ACID
- 应用场景:适用于字段数非常多、无更新、只取部分列的查询
5、性能比较
比对三种主流的文件存储格式TEXTFILE 、ORC、PARQUET
压缩比:ORC > Parquet > textFile(textfile没有进行压缩)
查询速度:三者几乎一致
HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名
- 对于大量数据的情况下,工作中常用orc 存储格式
- 我们在建表的时候可以通过命令
stored as
指定文件存储格式为orc,从而提高查询效率。
create table tableName(字段名称 字段类型 [comment '中文注释说明'],字段名称 字段类型, ....)
row format delimited fields terminated by 'char分割符即列分割符'
lines terminated by '行分割符'
stored as orc;