现象
alter table table_name add columns(location_id string) ; |
使用alter table语句更新变结构时,由于默认更行现有表结构,对历史分区表元数据无改动,导致原有分区变数据,新字段为null。
重新更新历史分区表也无动于衷,没有效果。
解决
hive 1.1.0以前办法,
alter table table_name partition(p='20190101') add columns(location_id string); |
通过添加partition一个一个分区修改 ,
hive 1.1.0后可以使用cascoda,在alter table语句后添加cascoda关键字执行,一劳永逸。
注意:CASCADE命令更改表更改列将更改表元数据的列,并将相同的更改级联到所有分区元数据
alter table table_name add columns(location_id string) cascoda|restrict; |
官方解释:
Hive 1.1.0中有CASCADE|RESTRICT子句。ALTER TABLE CHANGE COLUMN with CASCADE命令更改表元数据的列,并将相同的更改级联到所有分区元数据。RESTRICT是默认值,将列更改限制为表元数据。
ALTER TABLE CHANGE COLUMN CASCADE子句将覆盖表分区的列元数据,而不管表或分区的保护模式如何。使用自由裁量权。
column change命令只会修改Hive的元数据,不会修改数据。用户应该确保表/分区的实际数据布局与元数据定义一致。