Hive语言手册之四:压缩数据存贮与应用

一、压缩数据存储
有时候,Hive Table中的压缩数据比不压缩的数据在磁盘读取与查询性能方面都有比较好的性能。可以把使用GZip或BZip2压缩的文本数据直接导入到Hive,并且以TextFile格式进行存储,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将无法把数据文件分解成块实现并行处理,从而引起整个集群的运算能力利用不足。
比较好的解决方案是把数据插入到另一个以SequenceFile格式存储的表中,以SequenceFile格式存储的数据可以被Hadoop分解成块并且分配到多个Job上进行并行处理,处理过程示例如下:
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 (see below)
INSERT OVERWRITE TABLE raw_sequence SELECT * FROM raw;
参数io.seqfile.compression.type 用来指明以何种方式(NONE/RECORD/BLOCK)处理压缩数据。SequenceFile的操作中有三种处理方式:1) NONE:不压缩数据直接。2)RECORD:压缩value值不压缩key值存储的存储方式。3)BLOCK: key/value值都压缩的方式存储。
二、使用LZO
LZO是一个更关注压缩速度的无损压缩库,详细信息见http://www.oberhumer.com/opensource/lzohttp://www.lzop.org
想象在一个文件中包含以下三个列:
• id
• first name
• last name
文件中包含以下四条记录:
19630001     john          lennon
19630002     paul          mccartney
19630003     george        harrison
19630004     ringo         starr
文件命名为names.txt ,存放在/path/to/dir/。使用lzop工具把文件压缩成一个LZO文件并且命名为names.txt.lzo,然后把它复制到HDFS
1、Lzo/Lzop应用配置
(1)lzo 和lzop需要被安装在Hadoop集群中的每一个节点上,详细的安装细节在此不做详述,参见相关资料。
(2)配置文件core-site.xml,添加参数com.hadoop.compression.lzo.LzoCodec和com.hadoop.compression.lzo.LzopCodec:
<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.lzo.LzoCodec</value>
</property>
(3)创建LZO索引文件:
hadoop jar /path/to/jar/hadoop-lzo-cdh4-0.4.15-gplextras.jar com.hadoop.compression.lzo.LzoIndexer  /path/to/HDFS/dir/containing/lzo/files
2、创建表
下面的hive –e创建一个LZO压缩的外部表:
hive -e "CREATE EXTERNAL TABLE IF NOT EXISTS hive_table_name (column_1  datatype_1......column_N datatype_N)
         PARTITIONED BY (partition_col_1 datatype_1 ....col_P  datatype_P)
         ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
         STORED AS INPUTFORMAT  \"com.hadoop.mapred.DeprecatedLzoTextInputFormat\"
                   OUTPUTFORMAT \"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\";
注意:双引号必须进行转义,否则hive -e 无法正常工作
3、Hive查询
方法1:直接创建LZO文件
(1)直接为Hive查询输出创建LZO文件
(2)使用lzop命令工具或者编写Java程序为.lzo文件创建索引文件.lzo.index。
Hive查询参数
SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec
SET hive.exec.compress.output=true
SET mapreduce.output.fileoutputformat.compress=true
示例:
hive -e "SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;SET hive.exec.compress.output=true;SET mapreduce.output.fileoutputformat.compress=true;<query-string>"
     注意:如果数据集或者输出结果集太大,上面的命令将无法执行
方法2: 通过Java程序创建LZO文件
(1)以普通文本文件保存Hive查询结果
(2)写Java程序实现:Write custom Java code to
       (a) 把查询产生的文本文件转换成.lzo文件
       (b) 为.lzo文件生成LZO索引文件
Hive查询参数
SET hive.exec.compress.output=false
SET mapreduce.output.fileoutputformat.compress=false
示例:
hive -e "SET hive.exec.compress.output=false;SET mapreduce.output.fileoutputformat.compress=false;<query-string>"


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值