这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
正文
说明
- 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==