Hive的数据存储格式

Hive支持的存储格式有:
    Text File
    SequenceFile
    RCFile
    Avro Files
    ORC Files
    Parquet

注:Hive默认的格式为Text File,可以通过set hive.default.fileformat查看。
hive支持在创建表的时候对数据进行压缩,配置如下:
设置开启压缩:set hive.exec.compress.output=true;
查看压缩的格式:set mapreduce.output.fileoutputformat.compress.codec;
配置压缩的格式:set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec
SequenceFile格式的表数据比原始文件还要大,这是因为sequencefile表在创建时,增加了很多额外信息,在生产中不使用此种类型的文件格式;rcfile的作用仅仅是将存储空间节省了10%左右,在生产中不使用此种文件格式;所以在生产用的最多的存储格式是Text File(临时数据存储)、ORC Files和Parquet三种格式。

主要格式介绍说明:
1、TextFile

 TextFile文件不支持块压缩,默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。源文件可以直接通过hadoop fs -cat 查看。
2、RCFile
 Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能,但是不支持模式演进。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。
 RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
3、ORCFile
 存储方式:数据按行分块 每块按照列存储 ,压缩快 快速列存取,效率比rcfile高,是rcfile的改良版本,相比RC能够更好的压缩,能够更快的查询,但还是不支持模式演进。
hive/spark都支持这种存储格式,它存储的方式是采用数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。特点是数据压缩率非常高,是hive 0.11版里引入的新的存储格式,是对之前的RCFile存储格式的优化.
4、Parquet
 Parquet能够很好的压缩,有很好的查询性能,支持有限的模式演进。但是写速度通常比较慢。这中文件格式主要是用在Cloudera Impala上面的。
 sparksql默认的输出格式,parquet具有要较快的处理效率显然牺牲点存储(相对于orc格式)但是计算速度可以很大提升,加快响应速度,提供交互式查询。


使用转换举例:
1.默认存储格式为:纯文本

  stored as textfile;
2.二进制存储的格式
  顺序文件,avro文件,parquet文件,rcfile文件,orcfile文件。
3.转存parquet格式
  hive>create table hive.stocks_parquet stored as parquet as select * from stocks;
  说明:原始数据大小为stocks表[40万条],21M,转存parquet格式后,hdfs上数据文件大小为6M,压缩比在3倍左右;
4.转存rcfile
  hive> create table hive.stocks_rcfile stored as rcfile as select * from stocks ;
  说明:原始数据大小为stocks表[40万条],21M,转存rcfile格式后,hdfs上数据文件大小为16M,压缩比在0.7倍左右;
5.转存orcfile
  hive> create table hive.stocks_orcfile stored as orcfile as select * from stocks ;
  说明:原始数据大小为stocks表[40万条],21M,转存orcfile格式后,hdfs上数据文件大小为5M,压缩比在4倍左右;
总结:
textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高
rcfile 存储空间小,查询的效率高 ,需要通过text文件转化来加载,加载的速度最低
orc 存储空间最小,查询的最高 ,需要通过text文件转化来加载,加载的速度最低
在实际操作过程中另外3种都需要通过textfile临时存储导入数据

只有TEXTFILE表能直接加载数据,必须本地load数据,和external外部表直接加载运路径数据,都只能用TEXTFILE表。
更深一步,hive默认支持的压缩文件(hadoop默认支持的压缩格式),也只能用TEXTFILE表直接读取。其他格式不行。可以通过TEXTFILE表加载后insert到其他表中。
换句话说,SequenceFile、RCFile表不能直接加载数据,数据要先导入到textfile表,再从textfile表通过insert select from 导入到SequenceFile,RCFile表。
SequenceFile、RCFile表的源文件不能直接查看,在hive中用select看。

你可能感兴趣的:(Hadoop,#,Hive)