1. 程式人生 > >Hive學習(二)-資料匯入及匯出

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';

  該命令是將表匯出到分散式檔案系統中,且匯出的是表的結構與資料。