Hive分区表添加、修改、删除字段的坑

现象

alter table table_name add  columns(location_id string) ;

alter table table_name change column complete_status complete_status string;

使用alter table语句更新变结构时,由于默认更行现有表结构,对历史分区表元数据无改动,导致原有分区变数据,新字段为null。

重新更新历史分区表也无动于衷,没有效果。

解决

hive 1.1.0以前办法,

alter table table_name  partition(p='20190101') add  columns(location_id string);

alter table table_name partition(p='20190101') change column complete_status complete_status string;

通过添加partition一个一个分区修改 ,

hive 1.1.0后可以使用cascoda,在alter table语句后添加cascoda关键字执行,一劳永逸。

注意:CASCADE命令更改表更改列将更改表元数据的列,并将相同的更改级联到所有分区元数据

alter table table_name add  columns(location_id string) cascoda|restrict;

alter table table_name change column complete_status complete_status string cascoda|restrict;

官方解释:

Hive 1.1.0中有CASCADE|RESTRICT子句。ALTER TABLE CHANGE COLUMN with CASCADE命令更改表元数据的列,并将相同的更改级联到所有分区元数据。RESTRICT是默认值,将列更改限制为表元数据。

ALTER TABLE CHANGE COLUMN CASCADE子句将覆盖表分区的列元数据,而不管表或分区的保护模式如何。使用自由裁量权。

column change命令只会修改Hive的元数据,不会修改数据。用户应该确保表/分区的实际数据布局与元数据定义一致。

Author: Tunan
Link: http://yerias.github.io/2021/06/14/hive/27/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.