本文为翻译,源网页地址 https://cwiki.apache.org/confluence/display/Hive/CompressedStorage
仅限交流使用
压缩存储
Henvealf/译
在 Hive 的表中保持数据压缩,在一些情况下,能够比未压缩存储获得更好的效果,比如在磁盘利用率与查询性能上。
你能直接往存储为 TextFile 的表中导入使用了 Gzip 或者 BZip2 格式压缩的文本文件。Hive 会自动检测压缩格式并且直到查询执行时对文件进行解压。一个栗子:
Create Table raw(line String)
Row Format Delimited
Fields Terminated By '\t'
Lines Terminated By '\n';
Load Data Local InPath '/tmp/weblogs/20090603-access.log.gz' Into Table raw;
表’raw’被存储为默认的存储格式TextFile。然而在这个例子中,Hadoop 就切分不了你的文件了,以至于他们不会被放进 chunks/block 中,然后就不能在多个 map 中并发运行。这将会造成你不能充分利用你集群上的 mapping 能力。
所以推荐的方式是将数据插入另一个以 SequenceFile 格式存储的表中。一个 SequenceFile 可以被 Hadoop 切分,并且分发到 map job 中。GZIP 文件做不到这些的。
Create Table raw(line String)
Row Format Delimited
Fields Terminated By '\t'
Lines Terminated By '\n';
Create Table raw_sequence (line String)
Stored As SequenceFile;
Load Data Local InPath '/tmp/weblogs/20090603-access.log.gz' Into Table raw;
Set hive.exec.compress.output=true;
Set io.seqfile.compression.type=BLOCK; -- NONE/RECORD/BLOCK(看下面)
Insert OverWrite Table raw_sequence Select * From raw;
hive.exec.compress.output :控制hive的查询结果输出是否进行压缩,压缩方式在hadoop的mapred.output.compress中配置,默认不压缩false;
io.seqfile.compression.type 的值决定了压缩如何的执行的。
Record(默认)意思是记录级别的压缩,在执行压缩之前,当 BLOCK 缓冲超过了 1MB(默认), 就逐个的压缩每一个值(有些不懂).
Block 即是块级别的压缩。性能最好,而且可以分割。
End!!