如何在 Hive 中高效地存储数据以及在 Hive 中存储和检索压缩数据? 目前我将它存储为一个文本文件。 我正在浏览 Bejoy article我发现 LZO 压缩对于存储文件很有用,而且它是可拆分的。
我有一个生成一些输出的 HiveQL Select 查询,我将该输出存储在某处,以便我的一个 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 文件
并开始以 LZO 压缩格式存储数据
?或者文本文件在这里也可以吗?从选择查询开始,我将获得一些 GB 的数据,这些数据需要每天根据表格质量上传。
那么哪种方式最好呢?我应该将输出存储为 TextFile 还是 SequenceFile 格式(LZO 压缩),以便在查询 Hive 质量表时,我能更快地获得结果。意味着查询速度更快。
更新:-
如果我存储为带有 block 压缩的 SequenceFile 怎么办?就像下面-
set mapred.output.compress=true;
set mapred.output.compression.type=BLOCK;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec;
除了上述之外,我还需要设置一些其他的东西来启用 BLOCK Compression 吗?而且我正在创建 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
关于hadoop - 在 Hive 中高效存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11766421/