文件格式
在HIVE中,常见的文件存储格式有
- TextFile
- Parquet
- ORC
- Sequence
- RC
- AVRO
建表语句
这里我们根据不同的文件格式,新建测试表。
--textfile文件格式
CREATE TABLE `test_textfile`(`id` STRING,…,`desc` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS textfile;
--parquet文件格式
CREATE TABLE `test_parquet`(`id` STRING,…,`desc` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS parquet;
--orc文件格式
CREATE TABLE `test_orc`(`id` STRING,…,`desc` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS orc;
--sequence文件格式
CREATE TABLE `test_sequence`(`id` STRING,…,`desc` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS sequence;
--rc文件格式
CREATE TABLE `test_rc`(`id` STRING,…,`desc` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS rc;
--avro文件格式
CREATE TABLE `test_avro`(`id` STRING,…,`desc` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS avro;
区别比较
我们从同一个源表新增数据到这六张测试表,为了体现存储数据的差异性,我们选取了一张数据量比较大的源表(源表数据量为30000000条)。
下面从存储空间和SQL查询两个方面进行比较。
其中SQL查询为包含group by的计量统计和不含group by的计量统计。
sql01:select count(*) from test_table;
sql02:select id,count(*) from test_table group by id;
相关的查询结果如下(为了防止出现偶然性,我们每条SQL至少执行三次,取平均值)
文件存储格式 | HDFS存储空间 | 不含group by | 含group by |
---|---|---|---|
TextFile | 7.3 G | 105s | 370s |
Parquet | 769.0 M | 28s | 195s |
ORC | 246.0 M | 34s | 310s |
Sequence | 7.8 G | 135s | 385s |
RC | 6.9 G | 92s | 330s |
AVRO | 8.0G | 240s | 530s |
结论
从上面的测试结果可以看出
- 从占用存储空间来看,ORC和Parquet文件格式占用的空间相对而言要小得多。
- 从执行SQL效率来看,Parquet文件格式查询耗时要相对而言要小得多。
实际情况
从目前所得的结论来看,Hive中选用ORC和Parquet文件格式似乎更好一点,但是为什么Hive默认的文件存储格式是TextFile?
这是因为大多数情况下源数据文件都是以text文件格式保存(便于查看验数和防止乱码),这样TextFile文件格式的Hive表能直接load data数据。
如果说我们想使用ORC文件或者Parquet文件格式的表数据,可以先通过TextFile表加载后再insert到指定文件存储格式的表中。而这些不同文件格式的表我们可以通过数据分层保存,便于后期进行数据统计。