您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Hive如何實現數據裝載,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
既然Hive沒有行級別的數據插入、數據更新和刪除操作,那么往表中裝載數據的唯一途徑就是使用一種“大量”的數據裝載操作。或者通過其他方式僅僅將文件寫入到正確的目錄下。
第一種方式之前介紹過了,LOAD,一條命令一筆帶過
LOAD DATA LOCAL INPATH /data/ OVERWRITE INTO TABLE ods_login PARTITION (dt='2020-03-01');
第二種方式通過查詢語句向表中插入數據
INSERT語句允許用戶通過查詢語句向目標表中插入數據。依舊使用前章中表 ods_login作為例子,假設我們的ods_login已經通過load有數據了,數倉的下一層是dwd,那么我們需要將數據從ods_login寫入到dwd_login,像這樣(省略掉數據清洗邏輯)
INSERT OVERWRITE TABLE dwd_loginPARTITION (dt='20200302')SELECT * FROM ods_loginWHERE dt='20200302'
這里使用了 OVERWRITE關鍵字,因此之前分區中的內容(如果是非分區表,就是之前表中的內容)將會被覆蓋掉。這里如果沒有使用OVERWRITE關鍵字或者使用INTO關鍵字替換掉它的話,那么Hive 將會以追加的方式寫入數據而不會覆蓋掉之前已經存在的內容。
單個査詢語句中創建表并加載數據
用戶同樣可以在一個語句中完成創建表并將查詢結果載入這個表的操作:
CREATE TABLE dwd_loginAS SELECT name, salary, addressFROM ods_loginWHERE date='20200302'
這張表只含有dwd_login表中name、salary和address3個字 段的信息。新表的模式是根據SELECT語句來生成的。
使用這個功能的常見情況是從一個大的寬表中選取部分需要的數據集。
這個功能不能用于外部表。可以回想下使用ALTER TABLE語句可以為外部表“引用” 到一個分區,這里本身沒有進行數據“裝載”,而是將元數據中指定一個指向數據的 路徑。
然而,如果表ods_login非常大,而且需要從這個表中不同字段的數據做不同的處理,然后寫入不同的表中的話,就沒有那么簡單了。好在 Hive提供了另一種INSERT語法, 即只掃描一次輸入數據,然后按多種方式進行劃分。如下:
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表中讀取的每條 記錄都會經過一條SELECT ... WHERE ...句子進行判斷。這些句子都是獨立進行判斷的,不是 IF...THEN...ELSE...結構
事實上,通過使用這個結構,源表中的某些數據可以被寫入目標表的多個分區中或者不被寫入任一個分區中。
如果某條記錄是滿足某個SELECT ... WHERE ...語句的話,那么這條記錄就會被寫入 到指定的表和分區中。簡單明了地說,每個INSERT子句,只要有需要,都可以插入 到不同的表中,而那些目標表可以是分區表也可以是非分區表。
因此,輸入的某些數據可能輸出到多個輸出位置而其他一些數據可能就被刪除掉了。當然,這里可以混合使用INSERT OVERWRITE句式和INSERT INTO句式。
關于“Hive如何實現數據裝載”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。