6

如何有效地将数据存储在 Hive 中,并在 Hive 中存储和检索压缩数据?目前我将它存储为一个文本文件。我正在阅读Bejoy 的文章,我发现 LZO 压缩对于存储文件很有用,而且它是可拆分的。

我有一个 HiveQL Select 查询正在生成一些输出,并且我将该输出存储在某处,以便我的一个 Hive 表(质量)可以使用该数据,以便我可以查询该quality表。

下面是quality我通过创建用于覆盖表的分区来从下面的 SELECT 查询中加载数据的表quality

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吗?或者文本文件在这里也可以吗?从选择查询中,我将获得一些 GB 的数据,这些数据需要每天按表质量上传。

那么哪种方式最好呢?我应该将输出存储为 TextFile 还是 SequenceFile 格式(LZO 压缩),以便在查询 Hive 质量表时,我可以更快地获得结果。意味着查询更快。

更新:-

如果我使用块压缩存储为序列文件怎么办?如下图——

set mapred.output.compress=true;
set mapred.output.compression.type=BLOCK;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec;

除了上面之外,我还需要设置一些其他的东西来启用块压缩吗?而且我正在创建 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'
;
4

1 回答 1

1

我没有太多使用 Hive,但根据 Hadoop 和结构化数据的经验,我从带有 BLOCK 压缩的 SequenceFiles 中获得了最佳性能。默认为行压缩,但在存储结构化数据且行不是特别大的情况下,效率不如 BLOCK 压缩。要打开它,我使用了 mapred.output.compression.type=BLOCK

于 2012-08-02T11:10:33.063 回答