1.5.2、Compression
通过set hive.exec.compress.output命令来查看当前系统环境支持的压缩类型。
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec,
org.apache.hadoop.io.compress.BZip2Codec,
org.apache.hadoop.io.compress.SnappyCodec
各种压缩类型对比
1.5.2.1、ORC With Zlib/Snappy
表描述配置信息:
orc.compress:压缩类型
orc.compress.size:压缩大小
orc.stripe.size:每个strips的大小
orc.row.index.stride:索引之间的行数,必须得大于1000
orc.create.index:是否创建行索引
orc.bloom.filter.columns:创建字段对应的布隆过滤器,字段之间以逗号分隔。
orc.bloom.filter.fpp:布隆过滤器的误报概率
创建表的时候指定:
TBLPROPERTIES ("orc.compress"="ZLIB")
TBLPROPERTIES("orc.compress"="SNAPPY")
TBLPROPERTIES ("orc.compress"="NONE")
1.5.2.2、SequenceFile With Gzip/Bzip2
在一些场景下,可能会先生成压缩文件,然后再导入到Hive中。那么针对中这种已经压缩好的数据,Hive支持一些压缩格式,在读取的时候会自动进行解压缩。比如Gzip或者Bzip2,当然对于一些不可切分的压缩格式,在生成MR任务的时候,Map数就会有所限制,不能很好的发挥算力。
--示例
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;
最佳实践:
针对上面提到的问题,可以先把源文件加载到一张临时表中,然后写入到支持可切分的文件存储Hive表中,如SequenceFile。
--临时表,用于存储原始压缩文件
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.loggz' INTO TABLE raw;
--设置参数
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK;
--压缩方式 NONE/RECORD/BLOCK (see below)
INSERT OVERWRITE TABLE raw sequence SELECT * FROM raw;
1.5.2.3、LZO
配置:
编辑core-site.xml文件
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.1zo.LzoCodec</value>
</property>
创建
CREATE EXTERNAL TABLE IF NOT EXISTS hive table name (column_1 datatype_1......column_N datatype_N)
PARTITIONED BY (partition_col_1 datatype 1 )
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"
OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"
查询LZO存储表
SET hive exec.compress.output=true
SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec
SET mapreduce.output.fileoutputformat.compress=true