Как удалить сразу все разделы в улье?

Улей версии 1.1

У меня есть внешняя таблица улья, как показано ниже:

 CREATE EXTERNAL TABLE `schedule_events`(
  `schedule_id` string COMMENT 'from deserializer',
  `service_key` string COMMENT 'from deserializer',
  `event_start_date_time` string COMMENT 'from deserializer',
  `event_id` string COMMENT 'from deserializer',
  `event_type` string COMMENT 'from deserializer',
  `transitional_key` string COMMENT 'from deserializer',
  `created_date_time` string COMMENT 'from deserializer',
  `bus_date` string COMMENT 'from deserializer')
    PARTITIONED BY (
                    `year` string,
                    `month` string,
                    `day` string)
   ROW FORMAT SERDE
   'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
   STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
   OUTPUTFORMAT
   'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
   LOCATION
   'hdfs://nameservice1/hadoop/raw/omega/scheduled_events'
  TBLPROPERTIES (
    'avro.schema.url'='hdfs:////hadoop/raw/omega/schema/schedule_events.avsc',
   'transient_lastDdlTime'='1505742141')

Теперь, чтобы удалить конкретный раздел, я могу запустить команду ALTER, как показано ниже.

 ALTER TABLE schedule_events DROP IF EXISTS PARTITION  (year='2016',month='06',day='01')
 Dropped the partition year=2016/month=06/day=01

 hive> show partitions schedule_events;
 OK
 year=2017/month=09/day=01
 year=2017/month=09/day=02
 year=2017/month=09/day=03
 year=2017/month=09/day=04
 year=2017/month=09/day=05

Но в этой таблице много разделов.

Как удалить сразу все существующие разделы? Я хочу удалить сразу все существующие разделы? Это возможно?


person Surender Raja    schedule 19.09.2017    source источник
comment
Попробуйте ALTER TABLE schedule_events DROP IF EXISTS PARTITION (year is not null)   -  person Ambrish    schedule 19.09.2017
comment
@Ambrish Не думаю, что это сработает. Ваш запрос ALTER TABLE schedule_events DROP IF EXISTS PARTITION (year is not null) проверит, существует ли неправильный раздел year is not null.   -  person Ani Menon    schedule 24.01.2018


Ответы (4)


Есть несколько вариантов, вот один:

alter table schedule_events drop if exists partition (year<>'');

Hive: расширьте синтаксис ALTER TABLE DROP PARTITION, чтобы использовать все компараторы

"... Чтобы удалить раздел из таблицы Hive, это работает:
ALTER TABLE foo DROP PARTITION (ds = 'date')
... но это также должно работать, чтобы удалить все разделы до даты.
ALTER TABLE foo DROP PARTITION (ds ‹'date') Эта задача - реализовать ALTER TABLE DROP PARTITION для всех компараторов‹> ‹=> =‹> =! = вместо только для = "

https://issues.apache.org/jira/browse/HIVE-2908

person David דודו Markovitz    schedule 20.09.2017
comment
просто в качестве примечания, я пробовал это на aws athena, и это не сработало. Я получаю следующий код ошибки no viable alternative at input 'alter table TABLE_NAME drop' (service: amazonathena; status code: 400; error code: invalidrequestexception; request id: 3fe0eb78-2a17-...) - person otmezger; 06.06.2019
comment
@otmezger, Афина не имеет отношения к Улью - person David דודו Markovitz; 06.06.2019
comment
Афина просто улей под капотом, Давид ошибается. Проблема (которую трудно понять из сообщения об ошибке) заключается в том, что Афина настаивает на использовании двойных кавычек вместо одинарных. - person Bill Clark; 12.05.2020
comment
@BillClark - Нет, Афина - это Престо под капотом. docs.aws.amazon.com/athena/latest/ug/ presto-functions.html aws.amazon.com/big- data / what-is-presto - person David דודו Markovitz; 13.05.2020
comment
Достаточно справедливо, хотя различия между ними здесь не имеют значения. Дело в том, что ошибка возникла из-за использования одинарных кавычек, а не двойных, и это совсем не очевидно из самого сообщения об ошибке. В остальном синтаксис идентичен для Hive или Presto (и, следовательно, Athena). - person Bill Clark; 04.06.2020

Вы можете использовать что-то подобное:

ALTER TABLE schedule_events drop if exists partition (year>'0');
person Ani Menon    schedule 24.01.2018
comment
ALTER TABLE имя_таблицы DROP IF EXISTS PARTITION (год ›0). Этот запрос сработал для меня. Большое спасибо - person sunitha; 28.08.2019

изменить таблицу имя_схемы.имя_таблицы drop partition (partition_column! = '');

person Jitesh    schedule 03.04.2018

Использование Spark sql:

val paritions_values = spark.sql("show partitions "+databasename+'.'+tablename)
.collect().map(f=>f(0).toString)
.toArray.mkString("partition(", "," , "\")")
.replace("," , "\") ,partition(")
.replace("=", "=\"")

spark.sql("alter table "+databasename+'.'+tablename+" drop "+paritions_values)
person Venkatesh Surya Goli    schedule 02.03.2020