Hive 如何在配置单元中一次删除所有分区?

Hive 如何在配置单元中一次删除所有分区?,hive,hive-partitions,Hive,Hive Partitions,配置单元版本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` str

配置单元版本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
但是这个表有很多分区


如何一次删除所有现有分区?我想一次删除所有现有分区吗?这可能吗?

有多种选择,这里有一个:

alter table schedule_events drop if exists partition (year<>'');
alter table schedule_事件如果存在分区(年份“”),则删除;
配置单元:扩展ALTER TABLE DROP PARTITION语法以使用所有比较器

“…要从配置单元表中删除分区,此操作有效:
ALTER TABLE foo DROP PARTITION(ds='date')
…但它也可以在日期之前删除所有分区。
ALTER TABLE foo DROP分区(ds<'date') 此任务是为所有 比较器,<>=!=而不仅仅是for=”


您可以使用类似的方法:

ALTER TABLE schedule_events drop if exists partition (year>'0');

alter table schema_name.table_name drop partition(partition_column!='')

使用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)

尝试
altertableschedule\u如果存在分区(年份不为空),则删除事件。
@Ambrish我认为这不起作用。您的查询
ALTER TABLE schedule\u events DROP IF EXISTS PARTITION(year not null)
将检查一个分区
year not null
EXISTS,这是错误的。作为旁注,我在aws athena上尝试了这个方法,但没有成功。我在输入“alter table table_NAME drop”(服务:amazonathena;状态代码:400;错误代码:invalidrequestexception;请求id:3fe0eb78-2a17-…)时得到以下错误代码
没有可行的替代方案。
@otmezger,雅典娜与HiveAthena没有任何关系Thena只不过是引擎盖下的蜂巢,David错了。问题是(很难从错误信息中辨别出来)雅典娜坚持使用双引号而不是单引号。@BillClark-不,雅典娜是被蒙在鼓里的。很公平,尽管两者之间的差异在这里无关紧要。问题是,错误是由于使用单引号而不是双引号造成的,并且从错误消息本身来看,这一点并不明显。否则,Hive或Presto(以及Athena)的语法是相同的,如果存在分区(年份>0),则ALTER TABLE_name DROP。这个问题对我有效。谢谢