【问题标题】:Hive, how to drop partition, Error while compiling statement: FAILED: expecting set null in drop partition statementHive,如何删除分区,编译语句时出错:失败:期望在删除分区语句中设置 null
【发布时间】:2022-01-03 06:29:20
【问题描述】:

我在 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 更受欢迎。

感谢您的宝贵意见。

【问题讨论】:

    标签: apache-spark hadoop hive database-partitioning


    【解决方案1】:

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

    所以,唯一的选择是 -

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

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

    【讨论】:

    • 你确定没有动态方式吗?我基本上是在寻找一种方法来依次编写这两个命令:Alter Table my_table Drop Partition (date_year, date_month);更改表 my_table 添加分区 (new_col);但正如我之前所说,两者都让我失望了。
    • 按照您建议的过程,我使用新的分区键创建了一个新表,并尝试 MSCK 修复表 my_table_with_new_PK;获取其中的数据。但是,我遇到了一系列新错误。出于某种原因,MSCK 在编译语句时给了我错误错误:失败:执行错误,从 org.apache.hadoop.hive.ql.ddl.DDLTask 返回代码 1。我不确定原因是什么,但我最初的猜测是因为新分区键列中的空值。
    • 这让我想到了一个不同的问题,如何按具有空值的列对表进行分区。我将此问题放入一个新链接中,说明如何按具有空值的列对表进行分区。你也可以看看吗:stackoverflow.com/questions/70114230/…
    • 最重要的是是否有一种更简单更聪明的方法,而不是重新创建表进行重新分区。
    • 希望有更聪明的方法...但是 hive 为每个分区创建文件夹,这意味着 os 必须再次重新创建文件夹结构并将数据分发到其中。所以这是你手动做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2019-07-26
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多