Hive 的文件存储格式怎么选择?

前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

正文

说明

  • Hive支持的存储数的格式常见的有: TEXTFILE 、 SEQUENCEFILE 、 ORC 、 PARQUET 。
  • 其中 TEXTFILE 为默认格式,建表时默认为这个格式,导入数据时会直接把数据文件拷贝到 hdfs 上不进行处理。
  • SEQUENCEFILE 、 ORC 、 PARQUET 格式的表不能直接从本地文件导入数据,然后再从 TEXTFILE 表中用 insert 导入到 SEQUENCEFILE、ORC、PARQUET 表中。
  • TEXTFILE 和 SEQUENCEFILE 的存储格式都是基于行存储的;
  • ORC 和 PARQUET 是基于列式存储的。

关于 SEQUENCEFILE 的更多内容请参考我的博客——SequenceFile 是什么?怎么用?
关于 ORC 的更多内容请参考我的博客——ORCFile是什么?
关于 PARQUET 的更多内容请参考我的博客——Parquet是什么
关于 AVRO 的更多内容请参考我的博客——Apache Avro是什么?

Hive 支持的所有文件存储格式

存储格式描述
STORED AS TEXTFILE存储为纯文本文件。TEXTFILE是默认文件格式,除非配置参数 hive.default.fileformat 有不同的设置。使用 DELIMITED 子句读取分隔文件。使用“ESCAPED BY”子句(例如ESCAPED BY ‘’)为分隔符启用转义如果您想处理包含这些分隔符的数据,则需要逃脱。也可以使用“NULL DEFINED AS”子句指定自定义NULL格式(默认值为“\N”)。(Hive4.0)表中的所有二进制列都假定为base64编码。要将数据读作原始字节:TBLPROPERTIES(“hive.serialization.decode.binary.as.base64"=“false”)
STORED AS SEQUENCEFILE作为压缩序列文件存储。
STORED AS ORC以ORC文件格式存储。支持ACID事务和基于成本的优化器(CBO)。存储列级元数据。
STORED AS PARQUET在Hive 0.13.0及更高版本中 Stored as Parquet format for the Parquet columnar storage format;在Hive 0.10,0.11或0.12中语法是 Use ROW FORMAT SERDE … STORED AS INPUTFORMAT … OUTPUTFORMAT
STORED AS AVRO以Hive 0.14.0及更高版本存储为Avro格式
STORED AS RCFILE以记录列文件格式存储。
STORED AS JSONFILE以Hive 4.0.0及更高版本存储为Json文件格式。
STORED BY以非本地表格格式存储。创建或链接到非本机表,例如由HBase或Druid或Accumulo支持的表。
INPUTFORMAT and OUTPUTFORMAT在file_format中,将相应的InputFormat和OutputFormat类的名称指定为字符串文本。例如,‘org.apache.hadoop.hive.contrib.fileformat.base64。Base64TextInputFormat’。对于LZO压缩,要使用的值是’INPUTFORMAT “com.hadoop.mapred.DeprecatedLzoTextInputFormat”,输出格式“org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat”

文件存储格式对比

1、 存储文件的压缩比测试

1.1 测试数据

测试数据

log.txt 大小为18.1 M

1.2 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 '/home/hadoop/log.txt' into table log_text ;
  • 查看表的数据量大小
dfs -du -h /user/hive/warehouse/log_text;

+------------------------------------------------+--+
|                   DFS Output                   |
+------------------------------------------------+--+
| 18.1 M  /user/hive/warehouse/log_text/log.txt  |
+------------------------------------------------+--+
1.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;
  • 查看表的数据量大小
dfs -du -h /user/hive/warehouse/log_parquet;

+----------------------------------------------------+--+
|                     DFS Output                     |
+----------------------------------------------------+--+
| 13.1 M  /user/hive/warehouse/log_parquet/000000_0  |
+----------------------------------------------------+--+
1.4 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 ;
  • 查看表的数据量大小
dfs -du -h /user/hive/warehouse/log_orc;
+-----------------------------------------------+--+
|                  DFS Output                   |
+-----------------------------------------------+--+
| 2.8 M  /user/hive/warehouse/log_orc/000000_0  |
+-----------------------------------------------+--+
1.5 存储文件的压缩比总结
ORC >  PARQUET >   TEXTFILE

2、存储文件的查询速度测试

2.1 TEXTFILE
select count(*) from log_text;
+---------+--+
|   _c0   |
+---------+--+
| 100000  |
+---------+--+
1 row selected (16.99 seconds)
2.2 PARQUET
select count(*) from log_parquet;
+---------+--+
|   _c0   |
+---------+--+
| 100000  |
+---------+--+
1 row selected (17.994 seconds)
2.3 ORC
select count(*) from log_orc;
+---------+--+
|   _c0   |
+---------+--+
| 100000  |
+---------+--+
1 row selected (15.943 seconds)
2.4 存储文件的查询速度总结
ORC >  TEXTFILE > PARQUET

3、存储和压缩结合

  • 使用压缩的优势是可以最小化所需要的磁盘存储空间,以及减少磁盘和网络io操作

  • ORC支持三种压缩:ZLIB,SNAPPY,NONE。最后一种就是不压缩,ORC默认采用的是ZLIB压缩

3.1 创建一个非压缩的的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") ;
  • 2、加载数据
insert into table log_orc_none select * from log_text ;
  • 3、查看表的数据量大小
dfs -du -h /user/hive/warehouse/log_orc_none;
+----------------------------------------------------+--+
|                     DFS Output                     |
+----------------------------------------------------+--+
| 7.7 M  /user/hive/warehouse/log_orc_none/000000_0  |
+----------------------------------------------------+--+
3.2 创建一个snappy压缩的ORC存储方式表
  • 1、创建一个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") ;
  • 2、加载数据
insert into table log_orc_snappy select * from log_text ;
  • 3、查看表的数据量大小
dfs -du -h /user/hive/warehouse/log_orc_snappy;
+------------------------------------------------------+--+
|                      DFS Output                      |
+------------------------------------------------------+--+
| 3.8 M  /user/hive/warehouse/log_orc_snappy/000000_0  |
+------------------------------------------------------+--+
3.3 创建一个ZLIB压缩的ORC存储方式表
  • 不指定压缩格式的就是默认的采用ZLIB压缩
  • 可以参考上面创建的 log_orc 表
  • 查看表的数据量大小
dfs -du -h /user/hive/warehouse/log_orc;
+-----------------------------------------------+--+
|                  DFS Output                   |
+-----------------------------------------------+--+
| 2.8 M  /user/hive/warehouse/log_orc/000000_0  |
+-----------------------------------------------+--+

存储方式和压缩总结

  • ORC 默认的压缩方式 ZLIB 比 Snappy 压缩的还小。
  • 在实际的项目开发当中,hive 表的数据存储格式一般选择:ORC 或 PARQUET
  • 由于snappy的压缩和解压缩 效率都比较高,压缩方式一般选择 snappy
  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 33
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值