Hive的存储格式
文章目录
- Hive的存储格式
- 1.存储格式简介
- 2.行存储与列存储
- 行式存储
- 列式存储
- 混合的 PAX 存储结构
- TextFile
- SequenceFile
Hive的存储格式
1.存储格式简介
Hive支持的存储数的格式主要有:TEXTFILE(默认格式) 、SEQUENCEFILE、RCFILE、ORCFILE、PARQUET。
textfile为默认格式,建表时没有指定文件格式,则使用TEXTFILE,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;
sequencefile,rcfile,orcfile格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中,然后再从表中用insert导入sequencefile、 rcfile、orcfile表中。
2.行存储与列存储
行式存储下一张表的数据都是放在一起的,但列式存储下数据被分开保存了。
行式存储
行存储模式就是把一整行存在一起,包含所有的列,这是最常见的模式。这种结构能很好的适应动态的查询。
比如:select a from tableA
和 select a, b, c, d, e, f, g from tableA
这样两个查询其实查询的开销差不多,都需要把所有的行读进来过一遍,拿出需要的列。
而且这种情况下,属于同一行的数据都在同一个 HDFS 块上,重建一行数据的成本比较低。
但是这样做有两个主要的弱点:
- 当一行中有很多列,而我们只需要其中很少的几列时,我们也不得不把一行中所有的列读进来,然后从中取出一些列。这样大大降低了查询执行的效率。
- 基于多个列做压缩时,由于不同的列数据类型和取值范围不同,压缩比不会太高。
**优点:**数据被保存在一起,insert和update更加容易
**缺点:**选择(selection)时即使只涉及某几列,所有数据也都会被读取
列式存储
列存储是将每列单独存储或者将某几个列作为列组存在一起。列存储在执行查询时可以避免读取不必要的列。而且一般同列的数据类型一致,取值范围相对多列混合更小,在这种情况下压缩数据能达到比较高的压缩比。
但是这种结构在重建行时比较费劲,尤其当一行的多个列不在一个 HDFS 块上的时候。比如我们从第一个 DataNode 上拿到 column A,从第二个 DataNode 上拿到了 column B,又从第三个 DataNode 上拿到了 column C,当要把 A,B,C 拼成一行时,就需要把这三个列放到一起重建出行,需要比较大的网络开销和运算开销。
**优点:**查询时只有涉及到的列会被读取,效率高
**缺点:**选中的列要重新组装,insert/update比较麻烦
混合的 PAX 存储结构
PAX 结构是将行存储和列存储混合使用的一种结构,主要是传统数据库中提高 CPU 缓存利用率的一种方法,并不能直接用到 HDFS 中。但是 RCFile 和 ORC 是继承自它的思想,先按行存再按列存。
TEXTFILE、SEQUENCEFILE的存储格式是基于行存储的
ORC和PARQUET是基于列式存储的。
TextFile
TextFile 为 Hive 默认格式,建表时不指定则默认为这个格式,导入数据时会直接把数据文件拷贝到 hdfs 上不进行处理。
创建一个 TextFile 格式的 Hive 表:
create table if not exists ldsx_table (
name STRING,
age STRING,
class_t STRING,
tc STRING)
row formated delimated fields terminated by '\t'stored as textfile; -- 可不指定(默认格式)
向 TextFile 表中加载数据:
load data local inpath "hdfs://xxxxx/xxxx/xxx.csv" into table textfile_table
TextFile 优缺点:
TextFile 格式因为不对导入的数据文件做处理,所以可以直接使用 load 方式加载数据,其他存储格式则不能使用 load 直接导入数据文件。所以 TextFile 的加载速度是最高的。
TextFile 格式虽然可以使用 Gzip 压缩算法,但压缩后的文件不支持 split。在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比 SequenceFile 高几十倍。
SequenceFile
SequenceFile 是 Hadoop API 提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFIle 的内部格式取决于是否启用压缩,如果是压缩,则又可以分为记录压缩和块压缩。
无压缩(NONE):如果没有启用压缩(默认设置)那么每个记录就由它的记录长度(字节数)、键的长度,键和值组成。长度字段为 4 字节。
记录压缩(RECORD):记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩。注意:键是不压缩的。
块压缩(BLOCK):块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。当记录的字节数达到最小大小,才会添加到块。该最小值由 io.seqfile.compress.blocksize 中的属性定义。默认值是 1000000 字节。格式为记录数、键长度、键、值长度、值。Record 压缩率低,一般建议使用 BLOCK 压缩。
创建一个 SequenceFile 格式的 Hive 表:
create table if not exists seqfile_table( ueserid STRING, movieid STRING, rating STRING, ts STRING)row format delimitedfields terminated by '\t'stored as sequencefile;
设置压缩格式为块压缩:
set mapred.output.compression.type=BLOCK;
向 SequenceFile 表中加载数据:
insert overwrite table seqfile_table select * from textfile_table;
复制
SequenceFile 优点:
- 支持基于记录(Record)或块(Block)的数据压缩。
- 支持 splitable,能够作为 MapReduce 的输入分片。
- 修改简单:主要负责修改相应的业务逻辑,而不用考虑具体的存储格式。
SequenceFile 的缺点:
- 需要一个合并文件的过程,且合并后的文件不方便查看。