使用 Hive裝載數據的幾種方式
阿新 • • 發佈:2017-06-04
rom art lec install 查詢語句 如果 mode lena 重寫 裝載數據
1、以LOAD的方式裝載數據
LOAD DATA [LOCAL] INPATH ‘filepath‘ [OVERWRITE] INTO TABLE tablename [PARTITION(partcol1=val1, partcol2=val2 ...)]
1) 使用LOCAL這個關鍵字,那麽這個路徑應該為本地文件系統路徑,是拷貝本地數據到位於HDFS上的目標位置,而不使用LOCAL這個關鍵字,那麽這個路徑應該為HDFS中的路徑,是把本身就在HDFS上的數據轉移到目標位置。 同時,因為文件是以這種方式移動的,Hive要求源文件和目標文件以及目錄應該在同一個文件系統中,不可以使用LOAD DATA 語句將數據從一個集群的HDFS中轉移到另一個集群的HDFS中。
2) 如果使用OVERWRITE 關鍵字,那麽目標文件夾中之前存在的數據將會刪除,如果沒有這個關鍵字,而目標文件夾中已經存在同名的文件時,會保留之前的文件並且會重新命名新文件為“之前的文件名_序列號”(這是在Hive v0.9.0版本中修復的,之前的版本是有同名的文件會被覆蓋重寫)。
3) 如果目標表是分區表那麽需要使用PARTITION 的子句,而且還必須為每個分區的鍵指定一個值。
4) 對於 INPATH 子句使用的文件路徑不可以包含任何文件夾。
5) Hive不會驗證裝載的數據和表的模式是否匹配,而會驗證文件格式是否和表結構定義的一致。如,表創建時定義的存儲格式是sequencefile,那麽轉載進去的文件也應該是sequencefile 格式的文件。
2、通過SELECT 語句向表中插入數據
insert overwrite table user_install_status2 partition (dt=‘20141117‘)
select aid,pkgname,uptime,type,country,gpcategory from
user_install_status
where dt=‘20141117‘;
1)使用了OVERWRITE 關鍵字,因此之前分區的內容將會被覆蓋掉。而不使用OVERWRITE 或者使用INTO替換掉OVERWRITE 的話,那麽Hive將會以追加的方式寫入數據(這是在Hive v0.8.0版本才有的)。
2) 如果分區特別的多會多次掃描表進行插入數據,非常耗費資源。可以用下面的方式只掃描一次表就把所有的分區的數據進行插入。
FORM user_install_status
insert overwrite table user_install_status2 partition (dt=‘20141117‘)
select aid,pkgname,uptime,type,country,gpcategory where dt=‘20141117‘
insert overwrite table user_install_status2 partition (dt=‘20141118‘)
select aid,pkgname,uptime,type,country,gpcategory where dt=‘20141118‘
insert overwrite table user_install_status2 partition (dt=‘20141119‘)
select aid,pkgname,uptime,type,country,gpcategory where dt=‘20141119‘
insert overwrite table user_install_status2 partition (dt=‘20141120‘)
select aid,pkgname,uptime,type,country,gpcategory where dt=‘20141120‘;
3、動態分區插入
insert overwrite table user_install_status2 partition (dt)
select ....., dt
from user_install_status ;
1)Hive 是根據SELECT 語句的最後一列來確定分區字段dt 的值。
2)動態分區默認情況下沒有開啟,要通過設置如下兩個參數來開啟
set hive.exec.dynamic.partition=true? 開啟動態分區
set hive.exec.dynamic.partition.mode=nonstrict?設為非嚴格模式執行,嚴格模式要求至少一個分區字段是靜態的
4、單個查詢語句中創建表並加載數據
create table user_install_status3 as
select aid, pkgname, uptime, type, country, gpcategory
from user_install_status
where dt=‘20141228‘;
1) 這種做法往往是從一個大的數據集中抽取一個小的數據集。
2)這種做法不能用於外部表。
使用 Hive裝載數據的幾種方式