天天看点

Hive 数据存储格式 orc格式1.Hive存储格式2.数据存储格式

1.Hive存储格式

Hive支持各种数据格式,Hive利用Hadoop的InputFormat API来从不同的数据源读取数据,使用OutputFormat API将数据写成不同的格式。

2.数据存储格式

修改查看当前默认文件存储格式

set hive.default.fileformat;
set hive.default.fileformat=Orc;
           

(1)text

Text是最简单最常见的存储格式,它是纯文本记录,也是Hive的默认格式。

--存储方式
行存储

--特点
空间利用率低
有序列化和反序列话的开销
           

建表语句:

create table inventory(
     inv_date_sk     int,
     inv_item_sk     int,
     inv_warehouse_sk     int,
     inv_quantity_on_hand     int
)
row format delimited fields terminated by '|' 
stored as textfile;
           

(2)sequence

二进制文件,以<key,value>的形式序列化到文件中

--存储方式
行存储

--特点
可分片 压缩
支持record和block压缩,但是record压缩率低,一般选择block压缩
优势是文件和hadoop api中的mapfile是相互兼容的。
           

建表语句:

create table inventory(
     inv_date_sk     int,
     inv_item_sk     int,
     inv_warehouse_sk     int,
     inv_quantity_on_hand     int
)
row format delimited fields terminated by '|' 
stored as sequencefile;
           

使用block压缩

set mapred.output.compression.type=BLOCK;
           

(3)rcfile

--存储方式
数据按行分块 每块按照列存储

--特点
压缩快 快速列存取
读记录尽量涉及到的block最少
读取需要的列只需要读取每个row group 的头部定义。
读取全量数据的操作 性能对比sequencefile没有明显的优势
           

建表语句:

create table inventory(
     inv_date_sk     int,
     inv_item_sk     int,
     inv_warehouse_sk     int,
     inv_quantity_on_hand     int
)
row format delimited fields terminated by '|' 
stored as rcfile;
           

(4)orc

ORCFile 为 Optimized RCFile, 就是RCFile的改良版本

--存储格式
列存储,列式存储比起传统的行式存储更适合批量OLAP查询

--特点
支持Zlib LZO和Snappy压缩
可分片
列式存储,减少IO
           

建表语句

create table inventory(
     inv_date_sk     int,
     inv_item_sk     int,
     inv_warehouse_sk     int,
     inv_quantity_on_hand     int
)
row format delimited fields terminated by '|' 
stored as orc tblproperties ("orc.compress"="NONE");
           

snappy压缩

stored as orc tblproperties ("orc.compress"="SNAPPY");
           

也可以使用alter table来设置

create table inventory(
     inv_date_sk     int,
     inv_item_sk     int,
     inv_warehouse_sk     int,
     inv_quantity_on_hand     int
)
row format delimited fields terminated by '|' 
stored as orc;

ALTER TABLE inventory SET TBLPROPERTIES('orc.bloom.filter.columns'='*','orc.compress'='ZLIB');
           

合并小文件

用于合并小文件。但是只支持RCFILE和ORC文件类型。但是合并之后可能hui导致数据量变多

官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

--普通表
ALTER TABLE table_name CONCATENATE;

--分区表 需要制定分区,分区字段为cur_date
ALTER TABLE table_name PARTITION 
(cur_date= 'val1', cur_date='val2', cur_date='val3', cur_date='val4') CONCATENATE;
           

orc总结:

  • 使用orc格式的存储,可以降低存储占用,而查询效率上也不会差,zlib和snnapy压缩格式对比,zlib压缩率会略高,但是查询效率略低于snnapy。建议使用orc的snnapy压缩。
  • 由于数据压缩,数据量变小,所以job启动后生成的map/reduce数目也会变少,占用的container就会少,所以变相增加了集群的计算能力。

注意:

不能直接通过以下sql语句来修改存储类型:

ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;
           

这个方法来修改原先是text格式的表为orc格式,那只是修改了表属性,而文件存储格式还是text的,所以查询会出现解析错误。

要使用orc格式,可以新建表,指定存储格式为orc,然后从原先的text表insert到新表中即可。

另外load方式加载数据,只是一个移动数据的过程,不会修改数据的格式,所以使用load加载数据要注意。

(5)parquet

--存储格式
行存储

--特点
Hadoop的通用存储格式,可以和Impala,Spark等数据查询引擎结合使用
具有很好的压缩性能,可以指定每一列的压缩方式。
可以减少大量的表扫描和反序列化的时间。
支持复杂嵌套的数据类型:json
           

建表语句

create table inventory(
     inv_date_sk     int,
     inv_item_sk     int,
     inv_warehouse_sk     int,
     inv_quantity_on_hand     int
)
row format delimited fields terminated by '|' 
stored as parquet;

-- 设置压缩格式为SNAPPY,根据需求来设置压缩格式,默认不压缩
ALTER TABLE inventory SET TBLPROPERTIES ('parquet.compression'='SNAPPY');
           

​​​​​​​(6)自定义格式

用户可以通过实现inputformat和 outputformat来自定义输入输出格式。

3.使用总结

(1)textfile 存储空间消耗比较大,并且压缩的text无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高

(2)orc存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低

继续阅读