背景:項(xiàng)目中,客戶使用hive內(nèi)表,由于邏輯變更,原h(huán)ive表結(jié)構(gòu)需要調(diào)整,新增字段。
一、新增字段
遇到hive表新增字段,以往建表都是建外表,直接drop后,重新創(chuàng)建。由于這次全部使用內(nèi)表創(chuàng)建的,所以使用add column功能新增字段。
alter table database.table_name add columns(col_type string comment '類型');
但是發(fā)現(xiàn),如果已經(jīng)存在記錄的情況下覆蓋寫入,新添加的字段任然為NUll。如果是新的記錄,則可以寫入。
注意:如果創(chuàng)建的是分區(qū)表,則在添加新字段時(shí),必須要帶上cascade,否則該字段無法進(jìn)入數(shù)據(jù)。
根本原因是元數(shù)據(jù)中帶分區(qū)表的元數(shù)據(jù)和hive的實(shí)際存儲(chǔ)不一致。
alter table database.table_name add columns(col_type string comment '類型') cascade;
如果已經(jīng)添加了字段,可以修改字段時(shí),在修改字段名時(shí)帶上,在修改回來。如下:
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修復(fù)
msck repair table database.table_name;
總結(jié):
對(duì)Hive表新增字段時(shí),官方給出的語法結(jié)構(gòu)如下:
ALTER TABLE table_name
[PARTITION partition_spec]
ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
[CASCADE|RESTRICT]
其中CASCADE選項(xiàng)為選填的字段,但是對(duì)于分區(qū)表,一定要加上,否則其歷史分區(qū)的元數(shù)據(jù)信息(metadata)將無法正常更新,導(dǎo)致訪問歷史分區(qū)時(shí)會(huì)報(bào)莫名的錯(cuò)誤?
cascade的中文翻譯為“級(jí)聯(lián)”,也就是不僅變更新分區(qū)的表結(jié)構(gòu)(metadata),同時(shí)也變更舊分區(qū)的表結(jié)構(gòu)。??
二、調(diào)整字段順序
注意:新增字段,默認(rèn)添加在字段最后,分區(qū)字段之前。
1、hive表中指定位置增加一個(gè)字段,分兩步:
第一步:先添加字段到最后(add columns);
第二步:然后再移動(dòng)到指定位置(change)
alter table 表名 add columns (列名 string comment '注釋');
alter table 表名 change 要移動(dòng)的列名 移動(dòng)后的列名 string after 指定位置的列名;
經(jīng)驗(yàn)證,hive中修改字段順序并沒有將字段對(duì)應(yīng)的值移動(dòng),只是單純的修改字段名,如果是空表(沒有數(shù)據(jù)),可以使用以上兩步;如果表中已經(jīng)有數(shù)據(jù)了不推薦這么做,如果想增加字段只能往最后一個(gè)字段后添加字段。
謹(jǐn)記?。。?/p>
2、如果已經(jīng)將列名修改了,該怎么復(fù)原呢?其實(shí)很簡(jiǎn)單,將新增字段移動(dòng)原始表的最后一個(gè)字段
alter table tmpdb.change_column_test change e e int after d;
三、刪除字段
Hive不能直接刪除列,不然底層系列化就亂了,我們可以通過replace語句來替換整張表的字段,達(dá)到同樣的效果。
實(shí)際上,使用alter語句,把保留的字段全部列出來,刪除的字段不要列出來。
例如:表tmpdb.del_col_test分區(qū)字段
date_month STRING,
date_day STRING,
org_code STRING
結(jié)構(gòu):
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)
假如,要?jiǎng)h除字段?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)
--注意:分區(qū)表,不用寫分區(qū)字段
);
語句中只寫想要保留的字段就可以。?文章來源:http://www.zghlxwxcb.cn/news/detail-487973.html
更多內(nèi)容,請(qǐng)查看:Hive分區(qū)表新增字段及修改表名,列名,列注釋,表注釋,增加列,調(diào)整列順序,屬性名等操作文章來源地址http://www.zghlxwxcb.cn/news/detail-487973.html
到了這里,關(guān)于hive表新增字段,指定新增字段位置,刪除字段的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!