hive表新增字段,指定新增字段位置,删除字段

文章介绍了在Hive内表中如何新增字段,需要注意在已有数据情况下新字段默认为NULL,分区表需使用CASCADE选项更新元数据。调整字段顺序时,Hive不会移动字段值,只能单纯改名,且不能直接删除字段,需用replace语句替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:项目中,客户使用hive内表,由于逻辑变更,原hive表结构需要调整,新增字段。

一、新增字段

遇到hive表新增字段,以往建表都是建外表,直接drop后,重新创建。由于这次全部使用内表创建的,所以使用add column功能新增字段。

alter table database.table_name add columns(col_type string comment '类型');

但是发现,如果已经存在记录的情况下覆盖写入,新添加的字段任然为NUll。如果是新的记录,则可以写入。

注意:如果创建的是分区表,则在添加新字段时,必须要带上cascade,否则该字段无法进入数据。

根本原因是元数据中带分区表的元数据和hive的实际存储不一致。

alter table database.table_name add columns(col_type string comment '类型') cascade;

如果已经添加了字段,可以修改字段时,在修改字段名时带上,在修改回来。如下:

alter table database.table_name change col_type col_type1 string comment '类型' cascade;
alter table database.table_name change col_type1 col_type string comment '类型' cascade;

或者使用如下sql修复

msck repair table database.table_name; 

总结:

对Hive表新增字段时,官方给出的语法结构如下:

ALTER TABLE table_name
  [PARTITION partition_spec]
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]

其中CASCADE选项为选填的字段,但是对于分区表,一定要加上,否则其历史分区的元数据信息(metadata)将无法正常更新,导致访问历史分区时会报莫名的错误 
cascade的中文翻译为“级联”,也就是不仅变更新分区的表结构(metadata),同时也变更旧分区的表结构。  

二、调整字段顺序

注意:新增字段,默认添加在字段最后,分区字段之前。

1、hive表中指定位置增加一个字段,分两步:

第一步:先添加字段到最后(add columns);

第二步:然后再移动到指定位置(change)

alter table 表名 add columns (列名 string comment '注释'); 
alter table 表名 change 要移动的列名 移动后的列名 string after 指定位置的列名;

经验证,hive中修改字段顺序并没有将字段对应的值移动,只是单纯的修改字段名,如果是空表(没有数据),可以使用以上两步;如果表中已经有数据了不推荐这么做,如果想增加字段只能往最后一个字段后添加字段。

谨记!!!

2、如果已经将列名修改了,该怎么复原呢?其实很简单,将新增字段移动原始表的最后一个字段

alter table tmpdb.change_column_test  change e e int after d;

三、删除字段

Hive不能直接删除列,不然底层系列化就乱了,我们可以通过replace语句来替换整张表的字段,达到同样的效果。

实际上,使用alter语句,把保留的字段全部列出来,删除的字段不要列出来。

例如:表tmpdb.del_col_test分区字段

 date_month STRING, 
 date_day STRING, 
 org_code STRING

结构:

  cost_ex_wl_f DECIMAL(38,18),
  cost_ex_bd_f DECIMAL(38,18),
  cost_ex_wx_f DECIMAL(38,18),
  cost_ex_km_f DECIMAL(38,18),
  cost_ex_jt_f DECIMAL(38,18),
  cost_ex_qt_f DECIMAL(38,18),
  cost_ex_jj_f DECIMAL(38,18),
  cost_ex_zj_f DECIMAL(38,18),
  cost_ex_gd_f DECIMAL(38,18),
  cost_ex_ww_f DECIMAL(38,18),
  cost_ex_cl_f DECIMAL(38,18)

假如,要删除字段 cost_ex_ww_f,  cost_ex_cl_f ,删除字段sql如下:

alter table tmpdb.del_col_test replace columns(
  cost_ex_wl_f DECIMAL(38,18),
  cost_ex_bd_f DECIMAL(38,18),
  cost_ex_wx_f DECIMAL(38,18),
  cost_ex_km_f DECIMAL(38,18),
  cost_ex_jt_f DECIMAL(38,18),
  cost_ex_qt_f DECIMAL(38,18),
  cost_ex_jj_f DECIMAL(38,18),
  cost_ex_zj_f DECIMAL(38,18),
  cost_ex_gd_f DECIMAL(38,18)
--注意:分区表,不用写分区字段
);

语句中只写想要保留的字段就可以。 

更多内容,请查看:Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作

### 如何在 Hive 新增字段Hive 中,可以通过 `ALTER TABLE` 语句来向已有的新增字段。以下是详细的说明以及相关注意事项: #### 新增字段的基础语法 可以使用以下基础语法向 Hive 新增字段: ```sql ALTER TABLE table_name ADD COLUMNS (column_name data_type [COMMENT 'comment']); ``` 此语法适用于简单地向结构中追加新的字段,默认情况下会将新字段添加到最后的位置[^1]。 #### 指定新增字段位置 如果希望控制新字段的具体位置,则需要依赖于更高级的功能支持。例如,在某些版本的 Hive 中允许通过特定方式调整字段顺序。然而需要注意的是,并非所有版本都完全兼容该特性。通常建议先确认所使用的 Hive 版本及其对应文档中的具体实现细节[^3]。 #### 处理分区的情况 对于分区而言,当执行了新增字段操作之后可能会面临一个问题——即原有数据的历史分区内针对这些新加入的列其值会被设置成 NULL 。这是因为原有的记录并没有实际存储关于这部分额外信息的数据所致[^2]。 #### 刷新旧分区数据(可选) 为了使新增字段能够正确反映至所有的历史分区当中(包括那些已经存在的),可以在命令后面附加参数 `CASCADE` ,这一步骤非常重要因为它能确保即使是在较老的一些子目录下也能同步更新相应的模式定义。 ```sql alter table your_table add columns (new_col int) cascade; ``` 这里强调一点就是只有当你的 hive 版本足够高并且确实启用了这一选项时才有效果;否则可能仍然只会影响到后续写入的新条目而无法追溯改变过去的内容[^4]。 #### 示例代码展示 下面给出一段完整的 SQL 脚本来演示整个过程: ```sql -- 创建测试用内部 CREATE TABLE IF NOT EXISTS test_internal ( id INT, name STRING COMMENT '姓名' ); -- 向现有中添加一个新的字符串类型的字段 age 并附带注释 ALTER TABLE test_internal ADD COLUMNS(age STRING COMMENT '年龄'); -- 如果是分区且想让改动应用到已有分区上则需加上cascade关键字 ALTER TABLE partitioned_table ADD COLUMNS(new_field DOUBLE) CASCADE; ``` ### 注意事项总结 - 确认当前环境下的 Hive 版本号因为不同发行版之间可能存在细微差异; - 对于含有大量存量数据的大规模生产环境中实施此类变更前务必做好充分准备比如备份重要资料等预防措施以防万一发生意外情况难以恢复原状; - 使用 `CASCADE` 参数可以帮助解决部分场景下的问题但是同样受限于具体的软件配置状态因此要提前验证可行性再行动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllenGd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值