繁体   English   中英

Hive,如何删除分区,编译语句时出错:失败:期望在删除分区语句中设置 null

[英]Hive, how to drop partition, Error while compiling statement: FAILED: expecting set null in drop partition statement

我在 Hive 中有一个表,我想删除它的分区键,以便以后使用其他分区键。

parquet 文件的位置在 Amazon S3 中。 我正在处理的表按 date_year 和 date_month 列进行分区。 共有143个分区。 现在我试图通过执行以下命令来删除分区:

Alter Table `my_hive_db`.`my_table`
Drop PARTITION (`date_year` , `date_month` );

但是,我收到此错误:

编译语句时出错:FAILED: ParseException line 48:28 mismatched input ','期望在 drop partition 语句中设置 null。

在此处输入图像描述

如果有帮助,我的表定义如下:

CREATE External Table `my_hive_db`.`my_table`(
    `col_id` bigint,
    `result_section__col2` string,
    `result_section_col3` string ,
    `result_section_col4` string,
    `result_section_col5` string,
    `result_section_col6__label` string,
    `result_section_col7__label_id` bigint ,
    `result_section_text` string ,
    `result_section_unit` string,
    `result_section_col` string ,
    `result_section_title` string,
    `result_section_title_id` bigint,
    `col13` string,
    `timestamp` bigint,
    `date_day` string
    )
    PARTITIONED BY ( 
      `date_year` string, 
      `date_month` string)
    ROW FORMAT SERDE 
      'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
    STORED AS INPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
    OUTPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
    LOCATION
      's3a://some/where/in/amazon/s3';

最重要的是,我真的不想删除底层文件。 我只想删除分区键,以便稍后我可以使用不同的列组合重新分区表。 问题是如何更改表,删除分区,但仍将表中的分区键保留为普通列

我愿意通过 Hive 或 Spark 来实现这一点。 但是,在这个阶段更优选Hive。

感谢您的宝贵意见。

我认为您不能根据不同的列重新分区 hive 表。 因为分区映射到HDFS中的物理文件夹,不能按需重新分配。

所以,唯一的选择是——

  1. 将表备份到 bkp 表中。
  2. 删除原始表并使用新分区重新创建表。
  3. 从备份插入新的原始表。

或者,您可以使用新分区创建一个新表并从旧表插入,然后删除旧表并重命名新表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM