一起學Hive——詳解四種匯入資料的方式
在使用Hive的過程中,匯入資料是必不可少的步驟,不同的資料匯入方式效率也不一樣,本文總結Hive四種不同的資料匯入方式:
- 從本地檔案系統匯入資料
- 從HDFS中匯入資料
- 從其他的Hive表中匯入資料
- 建立表的同時匯入資料
使用匯入資料時,會使用到into和overwrite into兩個關鍵字,into是在當前表追加資料,而overwrite into是刪除當前表的資料然後在匯入資料。
從本地系統匯入資料
在Hive中建立load_data_local表,該表中有兩個欄位,一個是name一個是age。建立表的SQL語句如下:
create table if not exists load_data_local(name string,age int) row format delimited fields terminated by ' ' lines terminated by '\n';
在本地檔案系統中建立一個load_data_local.txt的檔案,然後往裡面寫入資料,資料之間用空格分隔。資料為:
zhangsan 30
lisi 50
wangwu 60
peiqi 6
執行load data local inpath '/home/hadoop/hive_test/load_data_local.txt' into table load_data_local;
命令,即可將本地系統中的檔案的資料匯入到Hive表中。
在使用從本地系統匯入資料大Hive表中時,檔案的路徑必須使用絕對路徑。
有兩種方式驗證資料是否匯入成功,一種是在Hive中執行select * from load_data_local。
hadoop fs -ls /user/hive/warehouse/bigdata17.db/load_data_local
,結果為:
18/10/07 02:37:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 1 items -rwxr-xr-x 3 root supergroup 38 2018-10-07 02:24 /user/hive/warehouse/bigdata17.db/load_data_local/load_data_local.txt
從HDFS中匯入資料
在Hive中建立load_data_hdfs表,表中有兩個欄位,分別是name和age。建立表的SQL如下:
create table if not exists load_data_hdfs(name string,age int)
row format delimited fields terminated by ' '
lines terminated by '\n';
在本地檔案系統建立檔案load_data_hdfs.txt檔案,然後往裡面寫入資料。
將load_data_hdfs.txt檔案上傳到HDFS的data目錄下面,命令為:hadoop fs -put load_data_hdfs.txt /data
在Hive中執行命令:
load data inpath 'data/load_data_hdfs.txt' into table load_data_hdfs;
即可將資料匯入到Hive的load_data_hdfs表中。
從本地系統匯入資料和從hdfs檔案系統匯入資料用的命令都是load data,但是從本地系統匯入資料要加local關鍵字,如果不加則是從hdfs檔案系統匯入資料。
從hdfs檔案系統匯入資料成功後,會把hdfs檔案系統中的load_data_hdfs.txt檔案刪除掉。
從其他的Hive表中匯入資料
這種方式要求目標表和源表都必須存在。 建立一個要匯入資料的目標表,SQL如下:
create table if not exists load_data_local2(name string,age int)
row format delimited fields terminated by ' '
lines terminated by '\n';
匯入資料的SQL:
insert into table load_data_local2 select * from load_data_local;
這種資料匯入方式也適用於分割槽表和分桶表的情況。本文只介紹匯入分割槽表的情況,匯入資料到分割槽表分為靜態分割槽和動態分割槽兩種方式。
我們先建立一個分割槽表,SQL如下:
create table if not exists load_data_partition(name string)
partitioned by(age int)
row format delimited fields terminated by ' '
lines terminated by '\n';
將資料匯入分割槽表必須先在Hive中執行下面兩句語句:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
靜態方式將load_data_local表的資料匯入到load_data_partition表的sql語句如下:
insert into table load_data_partition partition(age=25) select name from load_data_local;
這種方式必須顯示的指定分割槽值,如果分割槽有很多值,則必須執行多條SQL,效率低下。
動態方式將load_data_local表的資料匯入到load_data_partition表的sql語句如下:
insert overwrite table load_data_partition partition select name,age from load_data_local;
這種方式要注意目標表的欄位必須和select查詢語句欄位的順序和型別一致,特別是分割槽欄位的型別要一致,否則會報錯。
一張表有兩個以上的分割槽欄位,如果同時使用靜態分割槽和動態分割槽匯入資料,靜態分割槽欄位必須寫在動態分割槽欄位之前。
Hive還支援一條SQL語句中將資料插入多個表的功能,只需將from關鍵字前置即可:
from load_data_local
insert overwrite table load_data_partition partition (age)
select name,age
insert overwrite table load_data_local3
select *
上面的sql語句同時插入到表load_data_partition和load_data_local3表中。這種方式非常高效,對於大資料量並且要將資料插入到多個表的情況下,建議用這種方式。
建立表的同時匯入資料
這種方式的建立表的表結構來自於select查詢語句的查詢欄位。
建立load_data_local3並將load_data_loaca的資料匯入到load_data_local3表中:
create table load_data_local3 as select * from load_data_local;