Hive 数据存储格式 orc格式

it2024-03-15  56

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");

合并小文件

用于合并小文件。但是只支持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;

(6)自定义格式

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

 

3.使用总结

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

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

最新回复(0)