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

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

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

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

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

然而,我得到这个错误:

编译语句时出错:失败:ParseException 行 48:28 不匹配的输入 ',' 期望在删除分区语句中设置 null。

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

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';

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

我愿意通过 Hive 或 Spark 实现这一目标。但是,现阶段更喜欢 Hive。

感谢您的宝贵意见。

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

所以,唯一的选择是 -

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

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