1.2.1 Hive存储格式

Hive中的数据分为真实数据与元数据,一般来说Hive的存储格式是指真实数据的存储格式。

Hive常用的存储格式包括以下4种:TEXTFILE、SEQUENCEFILE、RCFILE和ORCFILE。

1. TEXTFILE

常见的txt、csv、tsv等文件都属于TEXTFILE。Hive默认存储格式为TEXTFILE,即创建表时如果不单独指定存储格式,则认为存储格式为TEXTFILE。存储格式为按行存储,内容为普通的文本格式,一般可以使用cat命令直接查看。TEXTFILE格式的数据文件无须任何处理即可导入Hive,文件每一行为一条记录,记录可用任意分隔符进行列分割,记录之间须以行结束符分割。Hive将TEXTFILE映射为表的过程中,将会逐个字符地判断是否为列分隔符或行分隔符。

TEXTFILE支持使用Gzip压缩,但Gzip压缩后的文件将不再支持MapReduce分割机制,这意味着压缩后的文件不论有多少个HDFS块都只能被一个Map任务处理,即失去了使用集群并行处理的优势。

2. SEQUENCEFILE

SEQUENCEFILE是Hadoop提供的一种由“二进制序列化过的Key/Value字节流”组成的文本存储文件格式。其由于内容为二进制字节,所以无法通过cat命令查看原始字符,这可以抽象地理解为,在SEQUENCEFILE中每条记录均以键值对的方式进行存储,仅支持追加。与TEXTFILE类似,SEQUENCEFILE同样按行存储。

Hive无法直接导入SEQUENCEFILE格式的数据文件。数据须首先导入至TEXTFILE格式的表中,然后再从TEXTFILE格式的表中采用插入方式导入至SEQUENCEFILE格式的表。

SEQUENCEFILE是可分割的文件格式,支持3种压缩选项。

(1)NONE:不压缩。

(2)RECORD(默认选项):记录级压缩,压缩率低。

(3)BLOCK:块级压缩,压缩率高。

3. RCFILE

RCFILE(Record-Columnar File)是Facebook开发的一种专门面向列的数据存储格式,不同于TEXTFILE和SEQUENCEFILE,RCFILE是基于行列混合存储思想的设计。

RCFILE遵循“先水平划分,再垂直划分”的设计理念:首先把Hive表水平切分成多个行组,保证同一行的数据位于同一节点,其次在行组内按照“列”垂直切分,实现列与列的数据在磁盘上呈现为连续的存储块。使用RCFILE的优势是既保证了每条记录所有列在同一个HDFS块,也可以做到当查询仅针对表中的少数几列时,可跳过不必要的列进行数据读取。RCFILE存储格式如图1.4所示。

图1.4 RCFILE存储格式

注意

与SEQUENCEFILE类似,Hive在导入RCFILE格式的数据文件时也需要经过TEXTFILE转换。

RCFILE是可分割的文件格式,即在每个行组中,元数据头部(Metadata Header)和表格数据段会被分别压缩。对于元数据头部而言,RCFILE会使用行程长度编码(Run Length Encoding,RLE)算法压缩数据,而对于表格数据段而言,其每个列会通过Gzip压缩算法独立压缩。

4. ORCFILE

ORCFILE(Optimized Row-Columnar File)是对RCFILE的优化,可以提供一种高效的方法来存储Hive数据。ORCFILE的特点是:支持压缩比很高的压缩算法,文件可切分,提供多种索引,支持复杂的数据结构。

除了上面4种常见数据存储格式外,Hive还支持Parquet、Avro等格式,更多Hive存储格式的相关内容请扫描二维码获取。

Hive存储格式