存储格式
默认textfile的使用:
hive>create table t1(id int, name string) stored as textfile;
hive>create table t1(id int, name string);
默认存储的时候,使用的格式是textfile,上述两句语句的效果一样。
hive>desc formatted t1;
默认为textfile格式时候的格式:
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
hive>create table t2(id int, name string) stored as
inputformat 'org.apache.hadoop.mapred.TextInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
产生的结果与textfile相同
**注意:**inputformat与outputformat可以自己进行自定义
发展历程:
| TEXTFILE – (Default, depending on hive.default.fileformat configuration)
| RCFILE – (Note: Available in Hive 0.6.0 and later)
| ORC – (Note: Available in Hive 0.11.0 and later)
| PARQUET – (Note: Available in Hive 0.13.0 and later)
| AVRO – (Note: Available in Hive 0.14.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
**建议:**ORC与PARQUET足够了
行式存储 VS 列式存储
行式存储
如上图所示,行式存储的结构:
假设文件中有ABCD 4列,5行数据
- 对应HDFS里就是Block
- 那么在Block里面是什么样的结构呢?
- 行式存储带来的优点:
对于每一行数据的每一列,必然是在同一个Block里面的
- 行式存储带来的缺点:
因为一行记录有很多列,每一列的数据类型可能会是不一样的
如果每一列的数据类型都不一样,那么在压缩的时候,会带来麻烦
每种类型的压缩比都不一样,无法达到每种类型数据压缩比达到最好的效果
select a,b from xxx;
对于行式存储,是需要将所有的列都给读取出来的
也就是说c和d我们虽然用不上,但是它也会去读,这样会造成IO的提升
列式存储
如上图所示,列式存储的结构:
把每一行中的列给拆开了,存放在不同的Block里面了
列式存储不能保证同一行记录的所有列在同一个Block里面的
AB两列存在1个Block里
C列存在1个Block里
D列存在1个Block里
- 这样会带来一个很好的优势
既然是同一列的数据存在同一个Block里面,那么数据类型必然是一样的,就可以采用压缩比更高的方式进行压缩 - select c from xxx;
只需要拿走1个Block里面的数据就可以了,不用去碰其余两个Block里的数据
IO大幅度的减少 - 带来一个缺点:
查询的东西一多,要读取的Block多
===>
如果我们使用select * from xxx; 行式和列式可能没有多大的区别
如果我们查的是某些字段,那么列式的优势就体现出来了
在我们的大数据场景来说: - 可能我们有几百列,但是我们所查询的就几列
这种场景下,使用列式存储更好
TextFile
默认的存储格式
普通文件/json/xml ==> 使用TextFile进行存储
**注意:**使用TextFile进行存储,很多都是当作字符串来进行处理的
SequenceFile
如上图所示,Record是真正存放数据的,有3种级别:
- No compression的Record:
RecordLengt