【问题标题】:Efficiently Storing the data in Hive高效地将数据存储在 Hive 中
【发布时间】:2012-07-30 18:32:35
【问题描述】:

如何有效地将数据存储在 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 file 并开始将数据存储在LZO compression format 中吗?或者文本文件在这里也可以吗?从选择查询中,我将获得一些 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;

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

【问题讨论】:

    标签: hadoop mapreduce hive lzo


    【解决方案1】:

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

    【讨论】:

    • 感谢亚历克斯的建议。那么如果我需要使用带有 BLOCK Compress 的 Sequence 文件,那么我需要设置哪些参数呢?这些是我需要设置的参数吗? set mapred.output.compress=true set mapred.output.compression.type=BLOCK set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec 或者我需要设置什么?
    • 是的,我用这3个和hadoop 0.20.2版本就够了。
    • 感谢您的评论。我尝试使用上述 3 个命令,效果很好。所以我的问题是如果我需要查看以 LzoCodec 格式压缩的文件,那么我需要做什么。当我尝试使用 vi 文件名时,我在该文件中得到了一些奇怪的字符。所以我需要以某种方式解压缩该文件,然后我需要查看该文件?如果是,那么我如何解压缩该文件?下面是我使用ls 得到的文件名。 /apps/hdmi-technology/b_apdpds/lip-data-quality/dt=20120711/attempt_201207311206_10800_r_000000_0
    • 有 2 个选项:1)如果您的记录实际上是字符串,则可以使用“hadoop fs -text /hadoop_file_path > output_file.txt” 2)可以从任何 Java 程序访问 SequenceFiles,只需将 hadoop-*.jar 放入你的类路径,不要忘记本地库,查看使用示例查看源代码或stackoverflow.com/questions/7560515/…
    • 感谢亚历克斯的建议。那很有帮助。我还有一个问题。所以在我的情况下,我应该将表创建为一个 SequenceFile 可以吗?就像我在我的问题中更新了一样。你能看一下,让我知道它是否正确吗?
    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多