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

背景:项目中,客户使用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分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作

猜你喜欢

转载自blog.csdn.net/Allenzyg/article/details/130329541
今日推荐