2011-11-24 103 views
1

我使用Amazon的Elastic MapReduce的创建新表,我有一个蜂巢表基础上创建的文件夹中的一系列的Amazon S3存储日志文件和拆分一天像这样:蜂巢:从现有的分区表

  • 数据/天= 2011-09-01/log_file.tsv
  • 数据/天= 2011-09-02/log_file.tsv

目前我正在试图创建过滤掉一些额外的表这些日志文件中的不需要的活动,但我不知道如何做到这一点,并不断收到错误,如:

FAILED: Error in semantic analysis: need to specify partition columns because the destination table is partitioned.

如果我的初始表create语句看起来是这样的:

CREATE EXTERNAL TABLE IF NOT EXISTS table1 (
... fields ... 
) 
PARTITIONED BY (DAY STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
LOCATION 's3://bucketname/data/'; 

即初始表工作正常,我已经能够没有任何问题进行查询。

那么我应该如何创建一个共享前一个结构的新表,但只是过滤掉数据?这似乎并不奏效。

CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE table1; 

FROM table1 
INSERT OVERWRITE TABLE table2 
SELECT * WHERE 
col1 = '%somecriteria%' AND 
more criteria... 
; 

正如我上面所说,这将返回:

FAILED: Error in semantic analysis: need to specify partition columns because the destination table is partitioned.

谢谢!

回答

0

我从来没有使用like选项..所以谢谢你给我看。这实际上是否会创建第一个表的所有分区?如果不是,那可能是问题。你可以尝试使用动态分区

create external table if not exists table2 like table1; 
insert overwrite table table2 partition(part) select col1, col2 from table1; 

可能不是最好的解决办法,因为我认为你在select clause指定的列(以及在partition clause分区列)。

而且,您必须启用动态分区。

我希望这会有所帮助。

1

这总是对我的作品:

CREATE EXTERNAL TABLE IF NOT EXISTS table2 LIKE table1; 
INSERT OVERWRITE TABLE table2 PARTITION (day) SELECT col1, col2, ..., day FROM table1; 
ALTER TABLE table2 RECOVER PARTITIONS; 

请注意,我已经添加了“天”作为SELECT语句中的一列。另请注意,Hive有必要使用ALTER TABLE行来知道表2中新创建的分区。