如何在配置单元中高效存储数据,并在配置单元存储和检索压缩数据?目前,我将其存储为TextFile。我正在阅读Bejoy的文章,我发现LZO压缩将有利于存储文件,而且它是可拆分的。
我有一个HiveQLSelect查询,它正在生成一些输出,我将输出存储在某个地方,这样我的一个Hive表(质量)就可以使用该数据,这样我就可以查询quality
表。
下面是quality
表,我在其中通过使用于覆盖表quality
的分区从下面的SELECT查询加载数据。
create table quality
(id bigint,
total bigint,
error bigint
)
partitioned by (ds string)
row format delimited fields terminated by 't'
stored as textfile
location '/user/uname/quality'
;
insert overwrite table quality partition (ds='20120709')
SELECT id , count2 , coalesce(error, cast(0 AS BIGINT)) AS count1 FROM Table1;
因此,目前我将其存储为TextFile
,我是否应该将其作为Sequence file
并开始将数据存储在LZO compression format
中?或者文本文件在这里也可以?从select查询中,我将获得一些GB的数据,这些数据需要每天以表质量上传。
那么哪种方式最好呢?我应该将输出存储为TextFile或SequenceFile格式(LZO压缩),这样当我查询Hive质量表时,我会更快地得到结果。意味着查询速度更快。
更新:-
如果我存储为具有块压缩的SequenceFile会怎样?如下图所示-
set mapred.output.compress=true;
set mapred.output.compression.type=BLOCK;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec;
我需要设置一些其他的东西来启用BLOCK压缩,除了上面吗?此外,我正在将Table创建为SequenceFile格式的
再次更新
我应该创建下面这样的表吗?或者需要进行一些其他更改以启用序列文件的BLOCK压缩?
create table lipy
( buyer_id bigint,
total_chkout bigint,
total_errpds bigint
)
partitioned by (dt string)
row format delimited fields terminated by 't'
stored as sequencefile
location '/apps/hdmi-technology/lipy'
;
我很少使用Hive,但根据Hadoop和结构化数据的经验,我从使用BLOCK压缩的SequenceFiles中获得了最佳性能。默认情况下是行压缩,但当存储结构化数据且行不是特别大时,它不如BLOCK压缩有效。为了打开它,我使用了mapred.output.compression.type=BLOCK