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中的物理文件夹,不能按需重新分配。
所以,唯一的选择是 -
- 将 table 备份到 bkp table。
- 删除原始 table 并使用新分区重新创建 table。
- 从备份插入到新的原件table。
或者您可以使用新分区创建一个新的 table 并从旧的 table 插入,然后删除旧的并重命名新的 table.
我在 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中的物理文件夹,不能按需重新分配。
所以,唯一的选择是 -
- 将 table 备份到 bkp table。
- 删除原始 table 并使用新分区重新创建 table。
- 从备份插入到新的原件table。
或者您可以使用新分区创建一个新的 table 并从旧的 table 插入,然后删除旧的并重命名新的 table.