hive文件存储格式

来源:互联网 发布:标签编辑软件 编辑:程序博客网 时间:2024/06/04 17:29

hive文件存储格式

      用HIVE很久了,现在将HIVE存储格式大致大致总结一下:

      首先,看一下行存储和列存储的区别:

     行存储:基于Hadoop系统行存储结构的优点在于快速数据加载和动态负载的高适应能力,这是因为行存储保证了相同记录的所有域都在同一个集群节点,即同一个 HDFS块。不过,行存储的缺点也是显而易见的,例如它不能支持快速查询处理,因为当查询仅仅针对多列表中的少数几列时,它不能跳过不必要的列读取;此 外,由于混合着不同数据值的列,行存储不易获得一个极高的压缩比,即空间利用率不易大幅提高。

     列存储: 在HDFS上按照列组存储表格的例子。在这个例子中,列A和列B存储在同一列组,而列C和列D分别存储在单独的列组。查询时列存储能够避免读不必要的列, 并且压缩一个列中的相似数据能够达到较高的压缩比。然而,由于元组重构的较高开销,它并不能提供基于Hadoop系统的快速查询处理。列存储不能保证同一 记录的所有域都存储在同一集群节点,行存储的例子中,记录的4个域存储在位于不同节点的3个HDFS块中。因此,记录的重构将导致通过集群节点网络的大 量数据传输。尽管预先分组后,多个列在一起能够减少开销,但是对于高度动态的负载模式,它并不具备很好的适应性。

  
      其次,对HIVE目前存在的几种存储格式分别进行一下介绍:

1.textfile

textfile为默认格式
存储方式:行存储
优点:1. 可以任意的分隔符进行分割,
           2. 便于查看和编辑,可以直接在HDFS上查看明文文件
缺点:1. 磁盘开销大 数据解析开销大
           2. 压缩的text文件 hive无法进行合并和拆分
           3.从而无法对数据进行并行操作。

2.sequencefile

        二进制文件,以<key,value>的形式序列化到文件中
      SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。
存储方式:行存储
优点:1. 可分割 压缩(可以在块级别和记录级别进行压缩,对于优化磁盘利用率和I/O来说非常有意义)
           2. 一般选择block压缩,文件和hadoop api中的mapfile是相互兼容的。
缺点:并不适用于HADOOP生态系统之外的其他工具

3.rcfile

        RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按行划分,再垂直划分”的设计理念。
        当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。需要说明的是,RCFile在map阶段从 远端拷贝仍然是拷贝整个数据块,并且拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。
        (RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。)
适合:表字段特别多,而大多数的查询只需要使用其中一小部分字段的情况,只按列扫描指定的列,不再按行进行扫描
存储方式:数据按行分块 每块按照列存储
优点:1. 压缩快 快速列存取
           2. 读记录尽量涉及到的block最少
           3. 读取需要的列只需要读取每个row group 的头部定义。
           4. 读取全量数据的操作 性能可能比sequencefile没有明显的优势

4.orc

        ORC File,它的全名是Optimized Row Columnar (ORC) file,其实就是对RCFile做了一些优化。
        存储方式:数据按行分块 每块按照列存储
        据官方文档介绍,这种文件格式可以提供一种高效的方法来存储Hive数据。它的设计目标是来克服Hive其他格式的缺陷。运用ORC File可以提高Hive的读、写以及处理数据的性能。 
和RCFile格式相比,ORC File格式有以下优点: 
(1)、每个task只输出单个文件,这样可以减少NameNode的负载; 
(2)、支持各种复杂的数据类型,比如: datetime, decimal, 以及一些复杂类型(struct, list, map, and union); 
(3)、在文件中存储了一些轻量级的索引数据; 
(4)、基于数据类型的块模式压缩:a、integer类型的列用行程长度编码(run-length encoding);b、String类型的列用字典编码(dictionary encoding); 
(5)、用多个互相独立的RecordReaders并行读相同的文件; 
(6)、无需扫描markers就可以分割文件; 
(7)、绑定读写所需要的内存; 
(8)、metadata的存储是用 Protocol Buffers的,所以它支持添加和删除一些列。 

 5.自定义格式

       用户可以通过实现inputformat和 outputformat来自定义输入输出格式。


总结:

     1.  textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
     2.  sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
     3.  rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低
 


0 0
原创粉丝点击