打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何在表的指定位置添加字段?这种小技巧你应该掌握
userphoto

2022.08.18 广东

关注
作为一名程序员,在实际开发过程中,由于业务的拓展,我们时常会遇到需要往hive表增加字段,并指定字段位置。这种情况该怎么操作?
操作方法
先往目标表增加字段,然后再移动字段。
alter table table_name add columns(col_name string comment '字段说明') ;alter table table_name change col_name col_name string comment'字段说明' after col_name_2;
下面我们来实践下。
--创建用户表test.dwd_tb_user
create table test.dwd_tb_user(id bigint comment'自增主键', user_id string comment'用户id', user_name string comment'用户姓名', create_time string comment '创建日期', update_time string comment '修改日期') comment'用户信息表'stored as parquet
TBLPROPERTIES('parquet.compression'='SNAPPY');

表创建执行成功后,我们查看下表结构
--查看表结构
desc test.dwd_tb_user

可以看到,表test.dwd_tb_user目前有5个字段。

由于业务拓展,我们需要在表test.dwd_tb_user新增了一个字段phone,但又期望字段phone能加到user_name后面,这时候该怎么操作?
按照前面说的,先往目标表增加字段,然后再移动字段。

新加字段

alter table test.dwd_tb_user add columns(phone string comment '手机号码') ;

执行成功后查看表结构

desc test.dwd_tb_user

会发现phone字段是加到表最后面的。
别急,我们可以通过移动的方式来达到我们的效果。

移动新增的字段到指定位置

alter table test.dwd_tb_user change phone phone string comment'手机号码' after user_name;
执行成功后查看表结构
desc test.dwd_tb_user

这时候phone 字段已经移到user_name 后面了,已经达到我们期望的效果了,是不是感觉很不错。

小结:
先往目标表增加字段,然后再移动字段。

值得注意的是,我们刚才操作的目标表并没有分区,要是目标表是分区表,在执行更改字段类型、增加字段时,建议在语句末尾加上cascade,要不可能会遇到各种各样的莫名问题。

典型的有新加字段后旧分区中的col1将为空且无法更新,即便insert overwrite该分区也不会生效。

案例分析:实际应用中,常常存在修改数据表结构的需求,比如:增加一个新字段。
如果使用一般的add columns(col1 string)的语句增加字段的话,对于旧分区中的col1将为空且无法更新,即便insert overwrite该分区也不会生效。

这时候cascade就派上用场了。
1. cascade的中文翻译为“级联”,也就是不仅变更新分区的表结构(metadata),同时也变更旧分区的表结构。
2.标准语法如下:
ALTER TABLE table_name
[PARTITION partition_spec]ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
[CASCADE|RESTRICT]
其中CASCADE选项为选填的字段,但是对于分区表,一定要加上,否则其历史分区的元数据信息(metadata)将无法正常更新,导致访问历史分区时会报各种各样莫名的错误。

对此,官方给出的使用建议为:
ALTER TABLE ADD or REPLACE COLUMNS CASCADE will override the table partition’s column metadata regardless of the table or partition’s protection mode. Use with discretion.

解决这个问题也不难,对于分区表需要新加字段,我们只需要在新增字段的语句末尾加上CASCADE就可以解决问题了。

具体案例分析,可以看我之前写的一篇文章《解决hive表新增的字段查询为空null问题》感兴趣可以点进去看看。

如果目标表不是分区表,对目标表新加字段就没有必要在新增字段的语句末尾加上CASCADE,加上了反而会报异常,这是我实践中遇到的问题。
报异常信息如下:



总结
如何在hive表增加字段,并指定字段位置。方案:先往目标表增加字段,然后再移动字段。
如果表是分区表,要加上CASCADE,不是分区表,则不需要加。

由于笔者知识及水平有限,文中错漏之处在所难免,如有不足之处,请纠正,欢迎交流。
知识拓展
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
hive的insert语句列顺序问题以及新增字段遇到的坑
详解数仓分层设计架构 ODS-DWD-DWS-ADS
Hadoop Hive基础sql语法
PHP教程 61 - 优化-MYSQL
Hive DDL DML及SQL操作
hive行列转换面试题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服