Hive 改表結(jié)構(gòu)的兩個坑|避坑指南
Hive 在大數(shù)據(jù)中可能是數(shù)據(jù)工程師使用的最多的組件,常見的數(shù)據(jù)倉庫一般都是基于 Hive 搭建的,在使用 Hive 時候,遇到了兩個奇怪的現(xiàn)象,今天給大家聊一下,以后遇到此類問題知道如何避坑!
坑一:改變字段類型后更新數(shù)據(jù)不成功
關(guān)于 hive 插入數(shù)據(jù)的一個小坑,今天插入一個表中數(shù)據(jù),插入時寫的是常數(shù),比如 0.01 ,表中的字段也是 DECIMAL(5,2),按照常理插入的應(yīng)該是 0.01,但是插入后查詢是 0,為甚!

遇到問題,咱也不能退縮!就分析呀,看語句沒問題?。∵€是上網(wǎng)查查有沒有坑友。查了一圈發(fā)現(xiàn)還是觀望最靠譜!上 hive 官網(wǎng)查,呀~ 發(fā)現(xiàn)了原因!
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-Decimals
根據(jù)官網(wǎng)描述,發(fā)現(xiàn)在插入分區(qū)表時會出現(xiàn)這種情況,此時需要對之前的分區(qū)處理下~:
那就測試一下 按照官網(wǎng)的說法:
先建表:
CREATE TABLE `tb_dw_test`(
然后插入數(shù)據(jù):
insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
然后查詢:
hive> select * from tb_dw_test;
發(fā)現(xiàn)結(jié)果跟想象中的一樣~
然后修改表字段:
ALTER TABLE tb_dw_test REPLACE COLUMNS (a DECIMAL(5,2))
然后再次插入數(shù)據(jù):
insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
查詢:
hive> select * from tb_dw_test;
發(fā)現(xiàn)有問題啦!

那么按照官網(wǎng)處理:
Determine what precision/scale you would like to set for the decimal column in the table. For each decimal column in the table, update the column definition to the desired precision/scale using the ALTER TABLE command:
ALTER TABLE foo CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
If the table is a partitioned table, then find the list of partitions for the table:If the table is not a partitioned table, then you are done. If the table has partitions, then go on to step 3
SHOW PARTITIONS foo;
This can be done with a single ALTER TABLE CHANGE COLUMN by using dynamic partitioning (available for ALTER TABLE CHANGE COLUMN in Hive 0.14 or later, with HIVE-8411):Each existing partition in the table must also have its DECIMAL column changed to add the desired precision/scale.
SET hive.exec.dynamic.partition = true;
所以參照官網(wǎng),這里對表作如下處理:
ALTER TABLE tb_dw_test PARTITION (statis_date) CHANGE COLUMN a a DECIMAL(5,2);
再次插入數(shù)據(jù):
insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
然后查詢:
hive> select * from tb_dw_test;
發(fā)現(xiàn)結(jié)果跟想象中的一樣了。這個坑算是過去了~
坑二:增加字段后更新數(shù)據(jù)不成功
還是上面的例子那張表,再增加一個字段:
alter table tb_dw_test add COLUMNS (b varchar(5))
然后查詢
hive> select * from tb_dw_test;
發(fā)現(xiàn)新增的字段默認(rèn)的值是 NULL,現(xiàn)在我重新覆蓋一下元數(shù)據(jù),給增加的字段一個值:
insert overwrite table tb_dw_test partition(statis_date=20160501) values (2.01,0371);
然后查詢:
hive> select * from tb_dw_test;

不是我們想象的結(jié)果,查看一下官方文檔說明發(fā)現(xiàn)了問題的所在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns

?
靠譜的官網(wǎng)用紅色框框提示我們!那就這樣處理:
alter table tb_dw_test replace COLUMNS (a decimal(5,2),b varchar(5)) CASCADE;
直接查詢,發(fā)現(xiàn)數(shù)據(jù)顯示的數(shù)據(jù)已經(jīng)發(fā)生了變化了~
hive> select * from tb_dw_etst;
避坑指南
官方文檔?。」俜轿臋n??!官方文檔??!
綜上發(fā)現(xiàn),我們是按照 Oracle 這樣的標(biāo)準(zhǔn)在考慮 HiveSQL,但是通過閱讀官方文檔發(fā)現(xiàn)二者之間還是有很大不同的,底層原理差別還是有點大!通過這兩次踩坑發(fā)現(xiàn),仔細(xì)閱讀官方文檔的重要性?。?!
所以,以后大家遇到大數(shù)據(jù)開源組件的報錯問題,第一就是去找官方文檔,然后就去找社區(qū),總能發(fā)現(xiàn)驚喜!
#大數(shù)據(jù)開發(fā)##數(shù)據(jù)倉庫工程師##大數(shù)據(jù)開發(fā)工程師##面試題目#