已复制
全屏展示
复制代码

Hive 文件存储格式


· 3 min read

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;
🔗

文章推荐