Отбросить все разделы из таблицы улья?
Как я могу удалить все разделы, загруженные в настоящее время в таблицу Hive?
Я могу удалить один раздел с помощью alter table <table> drop partition(a=, b=...);
Я могу загружать все разделы с помощью инструкции восстановления разделов. Но я не могу отбросить все разделы.
Я использую последнюю версию Hive, поддерживаемую EMR, 0.8.1.
Ответы
Ответ 1
Начиная с версии 0.9.0 вы можете использовать компараторы в инструкции раздела перетаскивания, которая может быть использована для одновременного удаления всех разделов.
Пример, взятый из drop_partitions_filter.q testcase:
create table ptestfilter (a string, b int) partitioned by (c string, d string);
alter table ptestfilter add partition (c='US', d=1);
alter table ptestfilter add partition (c='US', d=2);
alter table ptestFilter add partition (c='Uganda', d=2);
alter table ptestfilter add partition (c='Germany', d=2);
alter table ptestfilter add partition (c='Canada', d=3);
alter table ptestfilter add partition (c='Russia', d=3);
alter table ptestfilter add partition (c='Greece', d=2);
alter table ptestfilter add partition (c='India', d=3);
alter table ptestfilter add partition (c='France', d=4);
show partitions ptestfilter;
alter table ptestfilter drop partition (c>'0', d>'0');
show partitions ptestfilter;
Ответ 2
При выборе разделов Hive позволяет использовать операторы сравнения (например, >
, <
, =
, <>
). Например, следующее должно оставить все разделы в таблице.
ALTER TABLE table_name DROP PARTITION (partition_name > '0');
Ответ 3
создайте новую таблицу t2 из существующей таблицы t1, как показано ниже.
create table t2 as
select * from t1;
удалить старую таблицу t1
drop table t1;
теперь проверьте, есть ли у вас разделы в новой таблице.
show partitions t2;
Ответ 4
Создайте таблицу, используя данные из исходной таблицы:
CREATE TABLE t2 AS
SELECT column_name_1, ..., column_name_N FROM t1;
Только в том случае, если это необходимо сделать в нестрогом режиме:
set hive.mapred.mode=nonstrict;
Надеюсь, это поможет. GL!
Ответ 5
truncate table table_name;
удалит все разделы. Это полезно, особенно если вы хотите удалить секционированную таблицу.