Hive:从现有分区表创建新表

时间:2011-11-24 17:05:27

标签: hadoop hive

我正在使用亚马逊的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.

谢谢!

2 个答案:

答案 0 :(得分: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语句中添加了“day”作为列。另请注意,有一个ALTER TABLE行,Hive必须知道在table2中新创建的分区。

答案 1 :(得分: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中的分区列)中指定列。

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

我希望这会有所帮助。