一、综述

1.建表规范

我们知道hive建表的完成格式如下:

 CREATE [EXTERNAL] TABLE [IF NOT EXISTS]     table_name      
  [(col_name   data_type   [COMMENT col_comment], ...)]        
  [COMMENT   table_comment]                                    
  [PARTITIONED BY(col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...)
  [SORTED BY(col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [ROW FORMAT row_format] 
  [STORED AS file_format]
  [LOCATION hdfs_path]  

其中的可选参数中STORED AS就是表中的存储格式,例如如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

2.文件存储格式

hive文件存储格式包括以下几类:

(1)、TEXTFILE
(2)、SEQUENCEFILE
(3)、RCFILE
(4)、ORCFILE(0.11以后出现)
(5)、PARQUET

说明:
其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理; SEQUENCEFILE,RCFILE,ORCFILE,PARQUET格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile,PARQUET各自表中;或者用复制表结构及数据的方式(create table as select * from table )。
一言以蔽之:如果为textfile的文件格式,直接load就OK,不需要走MapReduce;如果是其他的类型就需要走MapReduce了,因为其他的类型都涉及到了文件的压缩,这需要借助MapReduce的压缩方式来实现。

二、简介

1、textfile

默认格式;

存储方式为行存储;

磁盘开销大 数据解析开销大;

使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

2、sequencefile

二进制文件,以<key,value>的形式序列化到文件中;
存储方式:行存储;
可分割 压缩;
一般选择block压缩;
优势是文件和Hadoop api中的mapfile是相互兼容的

3、refile

存储方式:数据按行分块,每块按照列存储;
压缩快 快速列存取;
读记录尽量涉及到的block最少;
读取需要的列只需要读取每个row group 的头部定义;
读取全量数据的操作 性能可能比sequencefile没有明显的优势,

4、orcfile

存储方式:数据按行分块,每块按照列存储;

压缩快 快速列存取;

效率比rcfile高,是rcfile的改良版本。

5、parquet

类似于orc,相对于orc文件格式,hadoop生态系统中大部分工程都支持parquet文件。

三、主流方式对比(TEXTFILE 、ORC、PARQUET三者的对比)

所谓的存储格式就是在Hive建表的时候指定的将表中的数据按照什么样子的存储方式,如果指定了A方式,那么在向表中插入数据的时候,将会使用该方式向HDFS中添加相应的数据类型。例如TEXTFILE 、SEQUENCEFILE、ORC、PARQUET这四种存储,前面两种是行式存储,后面两种是列式存储。
如果为textfile的文件格式,直接load就OK,不需要走MapReduce;如果是其他的类型就需要走MapReduce了,因为其他的类型都涉及到了文件的压缩,这需要借助MapReduce的压缩方式来实现。
总结对比:

比对三种主流的文件存储格式TEXTFILE 、ORC、PARQUET
压缩比:ORC > Parquet > textFile(textfile没有进行压缩)
查询速度:三者几乎一致
HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名

四、使用案例(建表)

1、textfile,
-- 创建表,存储数据格式为TEXTFILE
create table log_text (
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as textfile ; 
 
--向表中加载数据 
load data local inpath '/opt/module/datas/log.data' into table log_text ;
 
--查看表中数据大小 
--这个过程不会走MapReduce,而是直接将文件上传到了HDFS,在HDFS上文件的名字还叫log.data
dfs -du -h /user/hive/warehouse/db_hive.db/log_text;
18.1 M  /user/hive/warehouse/db_hive.db/log_text/log.data
2、ORC
--创建表,存储数据格式为ORC
create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as orc ;
 


--向表中加载数据
insert into table log_orc select * from log_text ;
 
--查看表中数据大小
--这个过程要走MapReduce,而且文件是按照列式存储的,还会对文件进行压缩,
--Orc默认使用的压缩方式是zlib因此会更加节省空间,hadfs上是新的文件名,
 
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc;
2.8 M  /user/hive/warehouse/db_hive.db/log_orc/000000_0
3、Parquet
-- 创建表,存储数据格式为parquet
create table log_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t'
stored as parquet ; 
 
-- 向表中加载数据
insert into table log_parquet select * from log_text ;
 
--查看表中数据大小这个过程要走MapReduce,而且文件是按照列式存储的,因此会更加节省空间,
--hadfs上是新的文件名,
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_parquet;
13.1 M  /user/hive/warehouse/db_hive.db/log_parquet/000000_0
 

存储文件的压缩比总结:
ORC > Parquet > textFile

 
select count(*) from log_text; 
select count(*) from log_orc; 
select count(*) from log_parquet;

存储文件的查询速度总结:查询速度相近。

五、使用案例(压缩和存储的结合)

在建表的时候,如果我们指定了列式存储的方式,他会默认使用对于的压缩方式将我们的数据进行压缩,与此同时我们能够自己定制在文件存储的时候使用什么样子的压缩方式,例子如下:
以ORC存储格式为例

1.创建一个非压缩的的ORC存储方式
-- 建表
create table log_orc_none(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc tblproperties ("orc.compress"="NONE");
--插入数据
hive (default)> insert into table log_orc_none select * from log_text ;
2.创建一个SNAPPY压缩的ORC存储方式

– 建表

create table log_orc_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc tblproperties ("orc.compress"="SNAPPY");
-- 插入数据
hive (default)> insert into table log_orc_snappy select * from log_text ;
 
3.创建一个默认压缩的ORC存储方式
-- 建表
create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc ;
 
-- 向表中加载数据
insert into table log_orc select * from log_text ;

对比三者的压缩比:

hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_none;
18.1 M  /user/hive/warehouse/db_hive.db/log_orc_none/log.data
 
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_snappy;
3.8 M  /user/hive/warehouse/db_hive.db/log_orc_snappy/000000_0
 
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc;
2.8 M  /user/hive/warehouse/db_hive.db/log_orc/000000_0

总结:

没有压缩的orc格式相当于textfile,默认的压缩格式压缩比最大,snappy对数据进行了压缩
orc存储文件默认采用ZLIB压缩,ZLIB采用的是deflate压缩算法。因此比snappy压缩的小。
文件没有压缩的话,HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐