欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

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`(
復(fù)制代碼


然后插入數(shù)據(jù):


insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
復(fù)制代碼


然后查詢:


hive> select * from tb_dw_test;
復(fù)制代碼


發(fā)現(xiàn)結(jié)果跟想象中的一樣~


然后修改表字段:


ALTER TABLE tb_dw_test REPLACE COLUMNS (a DECIMAL(5,2))
復(fù)制代碼


然后再次插入數(shù)據(jù):


insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
復(fù)制代碼


查詢:


hive> select * from tb_dw_test;
復(fù)制代碼


發(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);
復(fù)制代碼


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;
復(fù)制代碼


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;
復(fù)制代碼


所以參照官網(wǎng),這里對表作如下處理:


ALTER TABLE tb_dw_test PARTITION (statis_date) CHANGE COLUMN a a DECIMAL(5,2);
復(fù)制代碼


再次插入數(shù)據(jù):


insert overwrite table tb_dw_test partition (statis_date=20160501) values(1.02);
復(fù)制代碼


然后查詢:


hive> select * from tb_dw_test;
復(fù)制代碼


發(fā)現(xiàn)結(jié)果跟想象中的一樣了。這個坑算是過去了~


坑二:增加字段后更新數(shù)據(jù)不成功


還是上面的例子那張表,再增加一個字段:


alter table tb_dw_test add COLUMNS (b varchar(5))
復(fù)制代碼


然后查詢


hive> select * from tb_dw_test;
復(fù)制代碼


發(fā)現(xiàn)新增的字段默認(rèn)的值是 NULL,現(xiàn)在我重新覆蓋一下元數(shù)據(jù),給增加的字段一個值:


insert overwrite table tb_dw_test partition(statis_date=20160501) values (2.01,0371);
復(fù)制代碼


然后查詢:


hive> select * from tb_dw_test;
復(fù)制代碼



不是我們想象的結(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ù)制代碼


直接查詢,發(fā)現(xiàn)數(shù)據(jù)顯示的數(shù)據(jù)已經(jīng)發(fā)生了變化了~


hive> select * from tb_dw_etst;
復(fù)制代碼

避坑指南

官方文檔?。」俜轿臋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ā)工程師##面試題目#
全部評論
學(xué)長好
點贊 回復(fù) 分享
發(fā)布于 2022-06-08 17:46
有用的話,大家點個贊
點贊 回復(fù) 分享
發(fā)布于 2022-05-22 17:25
學(xué)到了,太實用了,感謝大佬分享
點贊 回復(fù) 分享
發(fā)布于 2022-05-22 16:20

相關(guān)推薦

堅定的芭樂反對畫餅_許愿Offer版:人人都能過要面試干嘛,發(fā)個美團(tuán)問卷填一下,明天來上班不就好了
點贊 評論 收藏
分享
評論
16
28
分享

創(chuàng)作者周榜

更多
牛客網(wǎng)
??推髽I(yè)服務(wù)