在Hive中,如何仅将部分原始数据加载到表中?

时间:2014-09-29 06:35:30

标签: hadoop hive s3cmd

我有一个典型的CREATE TABLE声明如下:

CREATE EXTERNAL TABLE temp_url (
    MSISDN STRING,
    TIMESTAMP STRING,
    URL STRING,
    TIER1 STRING
)
row format delimited fields terminated by '\t' lines terminated by '\n'
LOCATION 's3://mybucket/input/project_blah/20140811/';

其中/ 20140811 /是一个内容为千兆字节数据的目录。

加载东西不是问题。然而,查询其中的任何内容,会使Hive窒息并简单地给我一些MapRed错误。

相反,我想问一下是否有办法只加载/ 20140811 /中数据的部分。我知道我可以从文件夹中选择一些文件,将它们转储到另一个文件夹中,并使用它,但这似乎很乏味,特别是当我有20个左右的/ 20140811 /目录时。

有这样的事情:

CREATE EXTERNAL TABLE temp_url (
    MSISDN STRING,
    TIMESTAMP STRING,
    URL STRING,
    TIER1 STRING
)
row format delimited fields terminated by '\t' lines terminated by '\n'
LOCATION 's3://mybucket/input/project_blah/Half_of_20140811/';

我也对非蜂巢的答案持开放态度。也许在s3cmd中有一种方法可以快速获取/ 20140811内的一定数量的数据/将其转储到/ 20140811_halved /或其他内容。

感谢。

2 个答案:

答案 0 :(得分:0)

我建议以下作为解决方法:

  1. 创建具有相同结构的临时表。 (使用像)
  2. 插入NEW_TABLE select * from OLD_TABLE limit 1000;
  3. 您可以添加尽可能多的过滤条件来过滤掉数据和加载。

    希望这会对你有所帮助。

答案 1 :(得分:0)

既然你说你已经拥有了这个/ 20140811 /目录"的20个左右,为什么不尝试在这些目录上创建一个带有分区的外部表并在一个目录上运行你的查询单一分区。