Hive表类型
Hive支持的表类型,或者称为存储格式有:TextFile、SequenceFile、RCFile、ORC、Parquet、AVRO。
TextFile
其中TextFile是文本格式的表,它是Hive默认的表结构;
在存储时使用行式存储,并且默认不进行压缩,所以TextFile默认是以明文的文本方式进行保存的,可以手动开启Hive的压缩功能进行数据压缩。
但在TextFile表压缩后再进行解压,即反序列化时,耗费的时间很大,是SequenceFile的十几倍。
TextFile表因为采用了行式存储,所以适合字段较少或者经常需要获取全字段数据的场景,在数据仓库场景的分析计算场景中一般不会使用TextFile表;
通常ETL流程导入的数据通常为文本格式,使用TextFile表可以很容易的将数据导入到Hive中来。
所以它常见的适用场景是作为外部数据导入存储,或者导出到外部数据库的中转表。
SequenceFile
SequenceFile同样是行式存储的表,它的存储格式为Hadoop支持的二进制文件,比如在MapReduce中数据读入和写出所使用的数据;其中Key为读取数据的行偏移量,Value为SequenceFile真正存储的数据,所以它在Hadoop中处理时,会减少文件转换所需要的时间。
SequenceFile支持压缩,可以选择None、Record、Block三种压缩方式,默认为Record,压缩率最高的是Block。
所以如果在生产中,需要数据进行行式存储、原生支持压缩,且要满足一定的性能要求,那么可以使用SequenceFile这种存储方式。
列式存储
RCFile、ORC、Parquet这三种格式,均为列式存储表——准确来说,应该是行、列存储相结合。在存储时,首先会按照行数进行切分,切分为不同的数据块进行存储,也就是行存储;在每一个数据块中,存储时使用的又是列式存储,将表的每一列数据存放在一起。
这种列式存储在大数据技术中尤为常见,它在海量数据场景中是很好的一种优化手段,可以减少数据读取、移动所花费的时间;
因为在结构化数据处理中,一般不会用到全部数据,而是选择某几列进行运算。
使用行式存储会将所有数据加载后再进行过滤,而列式存储可以只读取这几列数据,减少数据读取、处理所需要的时间。这在海量数据场景中可以节约非常多的时间。
RCFile
列式存储表中,RCFile现在基本很少使用了,它是ORC表的前身,支持的功能和计算性能都低于ORC表。
ORC
ORC表是Hive计算的主要表形式,是在RCFile的基础上进行了优化和改进,支持NONE、Zlib、Snappy压缩,在分析计算中的性能较好,是生产中常见的表类型。而且ORC表可以开启事务功能,以便支持数据更新、删除等操作;
但事务的开启会影响表的处理性能,所以非必要情况下不需要启用事务功能。
ORC表的问题在于,它是Hive特有的存储类型;所以在其它大数据产品中兼容性并不好,有些只有在较高的版本中才会支持。
parquet
Parquet表也是Hive计算的主要表形式,它的计算性能稍弱于ORC表;但因为Parquet文件是Hadoop通用的存储格式,所以对于其它大数据组件而言,具有非常好的数据兼容度;而且Parquet表可以支持数据的多重嵌套(如JSON的属性值可以是一个对象,且支持嵌套),但ORC表在多重嵌套上的性能并不好。
Parquet支持uncompressedsnappygziplzo压缩;其中lzo压缩方式压缩的文件支持切片,意味着在单个文件较大的场景中,处理的并发度会更高;因为一个压缩文件在计算时,会运行一个Map任务进行处理,如果这个压缩文件较大,处理效率就会降低。
但压缩文件支持再切分的话,在处理时可以Split成多个文件,从而启动多个Map任务进行并发处理,提升处理性能。
而ORC表的压缩方式不支持切分,如果单个压缩文件较大的话,性能会有影响。所以,对于ORC表和Parquet表的选择要区分使用场景,如果只在Hive中处理时使用,追求更高效的处理性能,且单个文件不是很大,或者需要有事务的支持,则选用ORC表。
但如果要考虑到与其它大数据产品的兼容度,且单个文件较为庞大,数据存在多重嵌套,则选用Parquet表。
AVRO
最后AVRO表,它主要为 Hadoop 提供数据序列化和数据交换服务,支持二进制序列化方式。
因为AVRO是Hadoop生态圈中,常用的一种用于数据交换、序列化的数据类型,它与Thrift类似。但要与TextFile区分开来,TextFile文本方式是常见的存储类型,基本所有系统都支持;
但一般而言,在数据传输中,不会直接将文本发送出去,而是先要经过序列化,然后再进行网络传输,AVRO就是Hadoop中通用的序列化标准。
所以,如果数据通过其他Hadoop组件使用AVRO方式传输而来,或者Hive中的数据需要便捷的传输到其他组件中,使用AVRO表是一种不错的选择。
总结
Hive在生产中,一般使用较多的是TextFile、Orc、Parquet。TextFile一般作为数据导入、导出时的中转表。ORC和Parquet表一般作为分析运算的主要表类型,如果需要支持事务,则使用ORC,如果希望与其它组件兼容性更好,则使用Parquet。
在性能上ORC要略好于Parquet。但Parquet支持压缩切分,有时候也是考虑因素。
当然除了这几种内置表,Hive还支持自定义存储格式。可通过实现 InputFormat 和 OutputFormat 来完成。