Hive: создание новой таблицы из существующей многораздельной таблицы - PullRequest
1 голос
/ 24 ноября 2011

Я использую 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 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 ]

1 голос
/ 31 августа 2013

Это всегда работает для меня:

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.Также обратите внимание, что есть строка ALTER TABLE, которая необходима Hive, чтобы узнать о разделах, которые были недавно созданы в table2.

0 голосов
/ 09 декабря 2011

Я никогда не использовал опцию 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).

И вы должны включить динамическое разбиение.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...