2011-11-24 125 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中新創建的分區。