1.生产常用的文件格式
查询hive的官网可知,hive的文件格式有如下
SEQUENCEFILE:生产中绝对不会用,k-v格式,比源文本格式占用磁盘更多
TEXTFILE:生产中用的多,行式存储
RCFILE:生产中用的少,行列混合存储,OCR是他得升级版
ORC:生产中最常用,列式存储
PARQUET:生产中最常用,列式存储
AVRO:生产中几乎不用,不用考虑
JSONFILE:生产中几乎不用,不用考虑
INPUTFORMAT:生产中几乎不用,不用考虑
hive默认的文件格式是TextFile,可通过set hive.default.fileformat 进行配置
2.行式与列式存储对比
大数据99%以上的场景都是使用的是列式存储数据2.1行式与列式存储数据物理底层存储区别
1)行式存储:textfile
所有的内容都放在一个 BLOCK 中
①优点:当select * 的时候,会直接将所有内容全部查出来
②缺点:当select a,c from xx 的时候,它还是将所有内容都查一遍,然后显示a,c列。
2)列式存储:orc parquet
按照列的方式 存储在几个 BLOCK 中
①优点:当select a,c from xx 的时候,它只需要查询 a,c所在的块,不需要多余的io。
②缺点:当select * 的时候,数据会发生 重组。
3.在hive上压缩文件:
1 | 创建一个表格并将数据加载到表格中: |
进入 hive官网
设置压缩:
1 | hive (d6_hive)> SET hive.exec.compress.output=true; 设置打开压缩 |
4.创建表的时候指定压缩格式:
进入到 DDL中 可以查看 压缩格式:
1 | file_format: |
怎么用呢:
1 | [ROW FORMAT row_format] |
TEXTFILE:是默认的存储格式,文本格式。
生产上用的最多的(列式):ORC和PARQUET
(注:导入数据的时候不能将文本中的数据导入到其它格式中,需要借助中间表)原文件大小:
1 | [hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hadoop fs -du -s -h /user/hive/warehouse/d6_hive.db/g6_access_copy |
RCFILE:
1 | hive (d6_hive)> create table g6_access_copy_RC ( |
ORC:默认采用了压缩
Index Data 中 存储了id以及其它,当查询的时候,读数据之前先会去读索引,通过查询id,可以知道查询内容属于哪一部分,只读取那一部分的内容即可。
1 | 创建一个表格,指定文件形式。 |
1 | 创建表: 指定文件形式 |
刚才是存储,那么接下来我们看一下查询
1 | 首先 我们查询一下表g6_access_copy: |
由此可以看出 orc 和 parquet 查询时所读取的数据量是比较少的,所以性能也比较好。
以后测性能的时候需要从两个角度考虑,一个是存储,一个是查询。
总结:
相同数据量的数据,列式存储(ORC、PARQUET)占的磁盘空间远远低于行式存储(如textfile),当查询部分字段是,列式存储的数据只需加载对应的列数据即可。
存少读少,极大磁盘使用以及IO,相对减少资源(内存,cpu)不必要的浪费,故列式存储在大数据领域完爆行式存储。