這篇文章將為大家詳細(xì)講解有關(guān)Hive如何實(shí)現(xiàn)數(shù)據(jù)裝載,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為三門峽企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站制作,三門峽網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
既然Hive沒有行級別的數(shù)據(jù)插入、數(shù)據(jù)更新和刪除操作,那么往表中裝載數(shù)據(jù)的唯一途徑就是使用一種“大量”的數(shù)據(jù)裝載操作?;蛘咄ㄟ^其他方式僅僅將文件寫入到正確的目錄下。
第一種方式之前介紹過了,LOAD,一條命令一筆帶過
LOAD DATA LOCAL INPATH /data/ OVERWRITE INTO TABLE ods_login PARTITION (dt='2020-03-01');
第二種方式通過查詢語句向表中插入數(shù)據(jù)
INSERT語句允許用戶通過查詢語句向目標(biāo)表中插入數(shù)據(jù)。依舊使用前章中表 ods_login作為例子,假設(shè)我們的ods_login已經(jīng)通過load有數(shù)據(jù)了,數(shù)倉的下一層是dwd,那么我們需要將數(shù)據(jù)從ods_login寫入到dwd_login,像這樣(省略掉數(shù)據(jù)清洗邏輯)
INSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200302')SELECT * FROM ods_loginWHERE dt='20200302'
這里使用了 OVERWRITE關(guān)鍵字,因此之前分區(qū)中的內(nèi)容(如果是非分區(qū)表,就是之前表中的內(nèi)容)將會被覆蓋掉。這里如果沒有使用OVERWRITE關(guān)鍵字或者使用INTO關(guān)鍵字替換掉它的話,那么Hive 將會以追加的方式寫入數(shù)據(jù)而不會覆蓋掉之前已經(jīng)存在的內(nèi)容。
單個(gè)査詢語句中創(chuàng)建表并加載數(shù)據(jù)
用戶同樣可以在一個(gè)語句中完成創(chuàng)建表并將查詢結(jié)果載入這個(gè)表的操作:
CREATE TABLE dwd_loginAS SELECT name, salary, addressFROM ods_loginWHERE date='20200302'
這張表只含有dwd_login表中name、salary和address3個(gè)字 段的信息。新表的模式是根據(jù)SELECT語句來生成的。
使用這個(gè)功能的常見情況是從一個(gè)大的寬表中選取部分需要的數(shù)據(jù)集。
這個(gè)功能不能用于外部表??梢曰叵胂率褂肁LTER TABLE語句可以為外部表“引用” 到一個(gè)分區(qū),這里本身沒有進(jìn)行數(shù)據(jù)“裝載”,而是將元數(shù)據(jù)中指定一個(gè)指向數(shù)據(jù)的 路徑。
然而,如果表ods_login非常大,而且需要從這個(gè)表中不同字段的數(shù)據(jù)做不同的處理,然后寫入不同的表中的話,就沒有那么簡單了。好在 Hive提供了另一種INSERT語法, 即只掃描一次輸入數(shù)據(jù),然后按多種方式進(jìn)行劃分。如下:
FROM ods_loginINSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200302')SELECT * WHERE event=‘login’ and dt=‘20200302’INSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200303')SELECT * WHERE event=‘login’ and dt=‘20200303’INSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200304')SELECT * WHERE event=‘login’ and dt=‘2020030
從ods_login表中讀取的每條 記錄都會經(jīng)過一條SELECT ... WHERE ...句子進(jìn)行判斷。這些句子都是獨(dú)立進(jìn)行判斷的,不是 IF...THEN...ELSE...結(jié)構(gòu)
事實(shí)上,通過使用這個(gè)結(jié)構(gòu),源表中的某些數(shù)據(jù)可以被寫入目標(biāo)表的多個(gè)分區(qū)中或者不被寫入任一個(gè)分區(qū)中。
如果某條記錄是滿足某個(gè)SELECT ... WHERE ...語句的話,那么這條記錄就會被寫入 到指定的表和分區(qū)中。簡單明了地說,每個(gè)INSERT子句,只要有需要,都可以插入 到不同的表中,而那些目標(biāo)表可以是分區(qū)表也可以是非分區(qū)表。
因此,輸入的某些數(shù)據(jù)可能輸出到多個(gè)輸出位置而其他一些數(shù)據(jù)可能就被刪除掉了。當(dāng)然,這里可以混合使用INSERT OVERWRITE句式和INSERT INTO句式。
關(guān)于“Hive如何實(shí)現(xiàn)數(shù)據(jù)裝載”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。