【hive】—原有分区表新增加列(alter table xxx add columns (xxx string) cascade;)

项目场景:

需求:需要在之前上线的分区报表中新增加一列。


实现方案:

1、创建分区测试表并插入测试数据

drop table test_1;
create table test_1
(id string,
score int,
name string
)
partitioned by (class string)
row format delimited fields terminated by ',';

insert overwrite table test_1
partition (class='A')
values('a',92,'lily'),('b',102,'mike');

查看原有分区表test_1的表结构

 desc test_1;

在这里插入图片描述

2、新增加一列 grade,数据类型为strIng

alter table test_1 add columns(grade string);

查看添加列之后的数据结构

desc test_1;

在这里插入图片描述

3、新增加列grade有数据后,插入新的分区B数据正常显示,原来A区grade列为NULL。

insert overwrite table test_1
partition (class='B')
values('a',92,'John','良好'),('b',112,'Jeff','优秀');

select * from test_1;

在这里插入图片描述

原因是: hive使用新增加列语句,只修改了hive的元数据, 并没有改变hdfs的数据文件。

显示Table和Partition的详细信息,及表数据存放的hdfs的数据文件路径。

desc formatted test_1;

在这里插入图片描述

查看具体分区的hdfs的数据文件路径

hadoop fs -lsr hdfs://b1/apps/database/hive/database/test_1

在这里插入图片描述

查看A、B两个分区下的hdfs的数据文件的内容,发现A区并没有grade的内容。

A区:

hadoop fs -cat hdfs://b1/apps/database/hive/database/test_1/class=A/000000_0

在这里插入图片描述

B区:

hadoop fs -cat hdfs://b1/apps/database/hive/database/test_1/class=B/000000_0

在这里插入图片描述


问题描述:

为了表的旧分区新增加列有数据,尝试重新写入A区的数据,发现A区新增列还是为NULL,重写分区后只有最新分区(B区)的新增列有数据。

insert overwrite table test_1
partition (class='A')
values('a',92,'lily','良好'),('b',102,'mike','良好');

select * from test_1;

在这里插入图片描述


原因分析:

“alter table test_1 add columns(grade string);”,hive新增加列只修改了更新分区的表结构(metadata),没有变更旧分区的表结构。

表的表结构

在这里插入图片描述

A分区的表结构

desc formatted test_1 partition(class='A');

在这里插入图片描述
B分区的表结构

desc formatted test_1 partition(class='B');

在这里插入图片描述

查看表的表结构和新增分区的表结构(B区)是一致,与旧分区的表结构(A区)不一致。


解决方案:

  • 方法一:删除原来的分区数据重新插入
alter table test_1 drop partition (class='A');

insert overwrite table test_1
partition (class='A')
values('a',92,'lily','良好'),('b',102,'mike','良好');

select * from test_1;

在这里插入图片描述

  • 方法二: 最初,需要在增加grade时加上cascade关键字,cascade的中文翻译为“级联”,也就是不仅变更新分区的表结构(metadata),同时也变更旧分区的表结构。

添加列的语法

ALTER TABLE table_name 
  [PARTITION partition_spec]                 -- (Note: Hive 0.14.0 and later)
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]  

注意:ALTER TABLE ADD|REPLACE COLUMNS with CASCADE command changes the columns of a table’s metadata, and cascades the same change to all the partition metadata. RESTRICT is the default, limiting column changes only to table metadata.

drop table test_1;
create table test_1
(id string,
score int,
name string
)
partitioned by (class string)
row format delimited fields terminated by ',';

insert overwrite table test_1
partition (class='A')
values('a',92,'lily'),('b',102,'mike');

alter table test_1 add columns(grade string) cascade;

insert overwrite table test_1
partition (class='A')
values('a',92,'lily','良好'),('b',102,'mike','良好');

在这里插入图片描述

如果已经执行添加操作,并且没有带cascade,可以尝试下面的方法:

alter table test_1 replace columns(id string ,score int,name string);

再重新带上cascade进行添加列的操作。


扩展

需求:增加一列,指定增加到原始的两列中间

1、新增加列grade

alter table test_1 add columns (grade string comment '新添加的列') cascade;

在这里插入图片描述

2、再对grade列进行排序(注意:必须添加cascade关键字,不然不会刷新旧分区数据,关键字cascade能修改元数据)

更新列的语法

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
--将grade增加到score列与name中间
alter table test_1 change column grade grade string after score cascade;

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive是基于Hadoop数据仓库工具,它支持在已有的分区表上添加的字段。如果你想要在分区表增加的字段,你需要遵循一些步骤: 1. **停止写入**:确保在修改分区表结构之前,表上的所有写操作都已经完成,因为写操作可能会对数据产生影响。 2. **分析现有表**:使用`DESCRIBE formatted <your_table>`命令检查当前表的结构,包括分区和现有字段。 3. **修改分区定义**:如果你只想在数据的一部分(例如,特定的分区)中添加字段,你需要创建一个的分区,然后将这部分数据移动到分区。如果是所有分区都增加字段,你可以直接在分区定义中增加。例如,如果你想在所有分区的`year`和`month`基础上添加一个`day`字段,分区定义可能变成`year=2022/month=1/day=<new_field>`。 4. **ALTER TABLE语句**:使用`ALTER TABLE <your_table> ADD PARTITION (year=2022, month=1, day=<new_field>)`或`ALTER TABLE <your_table> ADD COLUMNS <new_column_name> <data_type>`来添加字段。这里 `<new_column_name>`是字段名,`<data_type>`是对应的数据类型。 5. **验证和迁移数据**:再次运行`DESCRIBE formatted`来确认字段已经添加,并检查数据是否正确地移动到了分区或在所有分区中都有这个字段。 6. **重启服务**:可能需要重启Hive服务,让其加载的表结构。 7. **错误处理**:如果遇到问题,确保检查日志,可能会有关于数据不一致或权限不足的提示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值