做爲數據倉庫的Hive,存儲着海量用戶使用的數據。在日常的Hive使用過程當中,不免對遇到將外部數據導入到Hive或者將Hive中的數據導出來。今天主要就來學習一下Hive的幾種數據導入和導出的方式。數據庫
1、Hive數據導入方式ide
這裏主要介紹四種:oop
從本地文件系統中導入數據到Hive表;學習
從HDFS上導入數據到Hive表;code
從別的表中查詢出相應的數據並導入到Hive表中;hadoop
在建立表的時候經過從別的表中查詢出相應的記錄並插入到所建立的表中。ci
一、從本地文件系統中導入數據到Hive表string
基本語法:it
load data local inpath 本地文件路徑 into table Hive表名稱;io
先在Hive裏面建立好表(demo是網上的),以下:
hive> create table wyp (id int, name string, age int, tel string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; OK Time taken: 2.832 seconds
這個表很簡單,只有四個字段,具體含義我就不解釋了。本地文件系統裏面有個/home/wyp/wyp.txt文件,內容以下:
[wyp@master ~]$ cat wyp.txt
1 wyp 25 13188888888888
2 test 30 13888888888888
3 zs 34 899314121
wyp.txt文件中的數據列之間是使用\t分割的,能夠經過下面的語句將這個文件裏面的數據導入到wyp表裏面,操做以下:
hive> load data local inpath 'wyp.txt' into table wyp; Copying data from file:/home/wyp/wyp.txt Copying file: file:/home/wyp/wyp.txt Loading data to table default.wyp Table default.wyp stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 67] OK Time taken: 5.967 seconds
這樣就將wyp.txt裏面的內容導入到wyp表裏面去了,能夠到wyp表的數據目錄下查看,以下命令:
hive> dfs -ls /user/hive/warehouse/wyp ;
Found 1 items
-rw-r--r--3 wyp supergroup 67 2014-02-19 18:23 /hive/warehouse/wyp/wyp.txt
須要注意的是:
和咱們熟悉的關係型數據庫不同,Hive如今還不支持在insert語句裏面直接給出一組記錄的文字形式,也就是說,Hive並不支持INSERT INTO …. VALUES形式的語句。
二、HDFS上導入數據到Hive表
基本語法:
load data inpath HDFS文件路徑 into table Hive表名稱;
從本地文件系統中將數據導入到Hive表的過程當中,實際上是先將數據臨時複製到HDFS的一個目錄下(典型的狀況是複製到上傳用戶的HDFS home目錄下,好比/home/wyp/),而後再將數據從那個臨時目錄下移動(注意,這裏說的是移動,不是複製!)到對應的Hive表的數據目錄裏面。既然如此,那麼Hive確定支持將數據直接從HDFS上的一個目錄移動到相應Hive表的數據目錄下,假設有下面這個文件/home/wyp/add.txt,具體的操做以下:
[wyp@master /home/q/hadoop-2.2.0]$ bin/hadoop fs -cat /home/wyp/add.txt
5 wyp1 23 131212121212
6 wyp2 24 134535353535
7 wyp3 25 132453535353
8 wyp4 26 154243434355
上面是須要插入數據的內容,這個文件是存放在HDFS上/home/wyp目錄(和一中提到的不一樣,一中提到的文件是存放在本地文件系統上)裏面,咱們能夠經過下面的命令將這個文件裏面的內容導入到Hive表中,具體操做以下:
hive> load data inpath '/home/wyp/add.txt' into table wyp; Loading data to table default.wyp Table default.wyp stats: [num_partitions: 0, num_files: 2, num_rows: 0, total_size: 215] OK Time taken: 0.47 seconds
hive> select * from wyp; OK wyp1 23 131212121212 wyp2 24 134535353535 wyp3 25 132453535353 wyp4 26 154243434355 wyp 25 13188888888888 test 30 13888888888888 zs 34 899314121 Time taken: 0.096 seconds, Fetched: 7 row(s)
從上面的執行結果咱們能夠看到,數據的確導入到wyp表中了!請注意load data inpath ‘/home/wyp/add.txt’ into table wyp;裏面是沒有local這個單詞的,這個是和一中的區別。
三、從別的表中查詢出相應的數據並導入到Hive表中
基本語法:
insert into table 目標表名稱 [partition (分區字段=值)] select 一組字段 from 源表名稱;
假設Hive中有test表,其建表語句以下所示:
hive> create table test( id int, name string ,tel string) partitioned by (age int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; OK Time taken: 0.261 seconds
大致和wyp表的建表語句相似,只不過test表裏面用age做爲了分區字段。對於分區,這裏在作解釋一下:
分區:在Hive中,表的每個分區對應表下的相應目錄,全部分區的數據都是存儲在對應的目錄中。好比wyp表有dt和city兩個分區,則對應dt=20131218,city=BJ對應表的目錄爲/user/hive/warehouse/dt=20131218/city=BJ,全部屬於這個分區的數據都存放在這個目錄中。
下面語句就是將wyp表中的查詢結果並插入到test表中:
hive> insert into table test partition (age='25') select id, name, tel from wyp;
#########################################
這裏輸出了一堆Mapreduce任務信息,這裏省略
#########################################
Total MapReduce CPU Time Spent: 1 seconds 310 msec
OK
Time taken: 19.125 seconds
hive> select * from test; OK 5 wyp1 131212121212 25 6 wyp2 134535353535 25 7 wyp3 132453535353 25 8 wyp4 154243434355 25 1 wyp 13188888888888 25 2 test 13888888888888 25 3 zs 899314121 25 Time taken: 0.126 seconds, Fetched: 7 row(s)
這裏作一下說明:咱們知道咱們傳統數據塊的形式insert into table values(字段1,字段2),這種形式hive是不支持的。
四、在建立表的時候經過從別的表中查詢出相應的記錄並插入到所建立的表中
基本語法:
create table 新表名稱
as select 一組字段,逗號分隔 from 源表名稱;
在實際狀況中,表的輸出結果可能太多,不適於顯示在控制檯上,這時候,將Hive的查詢輸出結果直接存在一個新的表中是很是方便的,咱們稱這種狀況爲CTAS(create table .. as select)以下:
hive> create table test4
> as > select id, name, tel > from wyp;
hive> select * from test4;
OK
5 wyp1 131212121212
6 wyp2 134535353535
7 wyp3 132453535353
8 wyp4 154243434355
1 wyp 13188888888888
2 test 13888888888888
3 zs 899314121
Time taken: 0.089 seconds, Fetched: 7 row(s)
數據就插入到test4表中去了,CTAS操做是原子的,所以若是select查詢因爲某種緣由而失敗,新表是不會建立的!
2、Hive數據導出方式
能夠根據導出的地方不同,將這些方式分爲三種:
導出到本地文件系統;
導出到HDFS中;
導出到Hive的另外一個表中。
一、導出到本地文件系統
基本語法:
insert overwrite local directory '本地文件路徑'
select 字段 from Hive表名稱;
將上文表中的數據導出本地文件系統:
hive> insert overwrite local directory '/home/wyp/wyp'
>select * from wyp;
這條HQL的執行須要啓用Mapreduce完成,運行完這條語句以後,將會在本地文件系統的/home/wyp/wyp目錄下生成文件,這個文件是Reduce產生的結果。
二、導出到HDFS中
基本語法:
insert overwrite directory 'HDFS文件路徑'
select * from Hive表名稱;
將上文表數據導出到HDFS:
hive> insert overwrite directory '/home/wyp/hdfs'
select * from wyp;
將會在HDFS的/home/wyp/hdfs目錄下保存導出來的數據。注意,和導出文件到本地文件系統的HQL少一個local,數據的存放路徑就不同了。
三、導出到Hive的另外一個表中
與上文 從別的表中查詢出相應的數據並導入到Hive表中 一致。