Hive 文件存储格式
Hive 文件存储格式表示最终存储在 HDFS 上的文件格式,不同的文件格式对磁盘占用、查询速度等有重要的影响。
下面是创建 hive 表的语句例子。
CREATE TABLE `flow_logs`(
`ts` bigint,
`cell` bigint,
`username` string,
`pwd` string
)
row format delimited fields terminated by '|'
STORED AS ORC
TBLPROPERTIES ('transactional'='true','orc.compress'='SNAPPY');
一. TextFile
TextFile为默认的数据存储格式,TextFile以文本文件的形式存储数据,该种方式默认不对数据进行压缩处理,效率较低。导入数据时会直接把数据文件拷贝到hdfs上不进行处理。源文件可以直接通过hadoop fs -cat
查看。TextFile格式的数据无法使用压缩算法来压缩存储。
-- 在 beeline 查看默认的文件格式
set hive.default.fileformat
-- 设置默认文件格式。可选项有:TextFile, SequenceFile, RCfile, ORC, Parquet(注意:需在配置文件修改)
hive.default.fileformat
二. SequenceFile
一种Hadoop API
提供的二进制文件,使用方便、可分割、可压缩等特点。SEQUENCEFILE
将数据以<key,value>
的形式序列化到文件中。
SequenceFile 的压缩类型为块压缩,块压缩一次压缩多个记录,当记录的字节数达到某个值,才会添加到块。该值由 io.seqfile.compress.blocksize 中的属性定义。默认值是 1000000 字节。
-- 查看压缩块的记录大小
set io.seqfile.compress.blocksize;
下面是创建一个压缩的SequenceFile格式的hive表过程。
-- 创建raw表并导入纯文本数据
CREATE TABLE raw (line STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
LOAD DATA INPATH '/tmp/weblogs/20090603-access.log.gz' INTO TABLE raw;
-- 创建sequence表
CREATE TABLE raw_sequence (line STRING)
STORED AS SEQUENCEFILE;
-- 将raw数据导入到raw_sequence,导入时压缩存储。对hive.exec.compress.output的设置只对当前会话有效,如果是通过代码api的方式写入的话,也需要设置该值,才能使用压缩。
SET hive.exec.compress.output=true;
INSERT OVERWRITE TABLE raw_sequence SELECT * FROM raw;
RCFile 是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
通常RCfile不用手动指定压缩格式,RCFile自带压缩。
四. ORC
ORC(Optimized RCFile)存储源自于RCFile(Record Columnar File)这种存储格式。它具备一些非常高级的特性,比如支持update操作,支持 ACID,支持struct,array 复杂类型。
create table Addresses (
name string,
zip int
) stored as orc tblproperties ("orc.compress"="NONE");
tblproperties 的属性有如下这些。
Key | Default | Notes |
---|---|---|
orc.compress | ZLIB | high level compression (one of NONE, ZLIB, SNAPPY) |
orc.compress.size | 262,144 | number of bytes in each compression chunk |
orc.stripe.size | 268435456 | number of bytes in each stripe |
orc.row.index.stride | 10,000 | number of rows between index entries (must be >= 1000) |
orc.create.index | true | whether to create row indexes |
五. Parquet
Parquet能够很好的压缩,有很好的查询性能,但是写速度通常比较慢。
CREATE TABLE parquet_test (
id int,
str string,
mp MAP<STRING,STRING>,
lst ARRAY<STRING>,
strct STRUCT<A:STRING,B:STRING>
)
PARTITIONED BY (part string)
STORED AS PARQUET;