Hive學習(二)-資料匯入及匯出
首先,要知道HIve中表的列(field)是以何種方式分隔的。
Hive表中預設的記錄何欄位分割符
分隔符 | 描述 |
\n | 對於文字檔案來說,每行都是一條記錄,因此換行符可以進行分隔 |
^A(Ctrl+A) | 用於分隔欄位(列),在create table語句中可以使用八進位制編碼\001表示 |
^B | 用於分隔ARRAY或者struct中的元素,或用於MAP中鍵-值對之間的分隔。在create table語句中可以使用八進位制編碼\002表示 |
^C | 用於MAC中鍵何值之間的分隔。在create table語句中可以使用八進位制編碼\003表示 |
對於常見的文字檔案,比如.CSV和.TSV格式的檔案,它們分別是以逗號(,)和製表符(\t)進行列分割的。
現在建立一張表:
hive>
create table jc_tunnel ( TUNNEL_ID string comment '隧道ID', BEGIN_ROAD string comment '起始公里標', CREATE_BY string comment '建立人', CREATE_DATETIME string comment '建立時間', DIRECTION_ID string comment '行別表ID', END_ROAD string comment '截止公里標', MEMO string comment '備註資訊', SITE_ID string comment '區間戰場', TUNNEL_NAME string comment '隧道名稱', TUNNEL_NO string comment '隧道編號', UPDATE_BY string comment '更新人', UPDATE_DATETIME string comment '更新時間', ORDER_NUM string comment '排序號' ) comment '隧道表' row format delimited fields terminated by ',';
該表以逗號進行列分隔。
一.資料匯入
1.從檔案匯入
現在上傳資料到MAC1SN中。資料在檔案jc_tunnel.csv中,該檔案在本地檔案系統的使用者主目錄(~)下面。
執行命令:load data local inpath 'jc_tunnel.csv' into table jc_tunnel;
這裡加了local關鍵字,表示是從本地檔案系統中選擇檔案上傳;如果不加local,表示是從分散式檔案系統中選擇檔案上傳
可以看到資料已經上傳成功了。
然後檢視一下檔案上傳的地方:
這個時候,jc_tunnel.csv是作為表jc_tunnel的資料存在的,因此位於表目錄的下面,當然也可以檢視該資料。
執行命令:hive> dfs -cat /user/hive/warehouse/db_test.db/jc_tunnel/jc_tunnel.csv;
與原始檔案的內容一致:
再從表中查詢:
2.查詢匯入
先建立一張新表(jc_tunnel_new),結構和jc_tunnel一樣。
hive> create table jc_tunnel_new like jc_tunnel;
現在將從jc_tunnel查詢到的資料匯入到jc_tunnel_new:
hive> insert into jc_tunnel_new select * from jc_tunnel limit 0,3;
檢視匯入結果:
3.查詢建立表並載入資料
hive> create table jc_tunnel_new_s as select * from jc_tunnel limit 0,4;
4.分割槽表匯入
先將之前建立的jc_tunnel,jc_tunnel,jc_tunnel_s表刪除。
建立一張分割槽表
create table jc_tunnel (
TUNNEL_ID string comment '隧道ID',
BEGIN_ROAD string comment '起始公里標',
CREATE_BY string comment '建立人',
CREATE_DATETIME string comment '建立時間',
DIRECTION_ID string comment '行別表ID',
END_ROAD string comment '截止公里標',
MEMO string comment '備註資訊',
SITE_ID string comment '區間戰場',
TUNNEL_NAME string comment '隧道名稱',
TUNNEL_NO string comment '隧道編號',
UPDATE_BY string comment '更新人',
UPDATE_DATETIME string comment '更新時間',
ORDER_NUM string comment '排序號'
)
comment '隧道表'
partitioned by (area string comment '地區')
row format delimited
fields terminated by ',';
注意:建立分割槽表時,partitioned一定要寫在row等關鍵字的最前面。comment要寫在partitioned前面。Hive的表分割槽實際上就是一個目錄,且分割槽欄位不能與表的欄位重複。
匯入資料:hive> load data local inpath '/home/zhang/jc_tunnel.csv' into table jc_tunnel partition ( area = 'GZ' );
匯入資料時,分割槽名稱不能有中文字元。
可以看到,剛剛上傳的檔案是存在分割槽目錄下的。
二.資料匯出
將查詢的結果匯出到目標檔案中:
方法1:
[email protected]:~$ hive -S -e 'select t.tunnel_id,t.tunnel_name from db_test.jc_tunnel t limit 0,2' > query.txt
其中的-e命令表示命令執行結束後hive CLI立即退出;-S命令可以開啟靜默模式,這樣在輸出結果中去掉“OK”,“Time taken”等行以及其他一些無關緊要的東西。
方法2:
hive> insert overwrite local directory '/home/zhang/query' select t.tunnel_id,t.tunnel_name from db_test.jc_tunnel t limit 0,2;//將查詢結果匯入資料到本地的query資料夾中
匯入完成後,檢視目錄。
如果匯入時不加入local關鍵字,則是匯入到hdfs中。可以使用"dfs -cat 匯入目錄"檢視匯入結果。
方法3:
使用命令:
hive>export table jc_tunnel to '/user/zhang/export';
該命令是將表匯出到分散式檔案系統中,且匯出的是表的結構與資料。