Hive支持各种数据格式,Hive利用Hadoop的InputFormat API来从不同的数据源读取数据,使用OutputFormat API将数据写成不同的格式。
修改查看当前默认文件存储格式
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来自定义输入输出格式。
(1)textfile 存储空间消耗比较大,并且压缩的text无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
(2)orc存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低