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文件转化来加载,加载的速度最低