作為數(shù)據(jù)倉庫的Hive,存儲(chǔ)著海量用戶使用的數(shù)據(jù)。在平常的Hive使用過程中,難免對遇到將外部數(shù)據(jù)導(dǎo)入到Hive或者將Hive中的數(shù)據(jù)導(dǎo)出來。今天主要就來學(xué)習(xí)一下Hive的幾種數(shù)據(jù)導(dǎo)入和導(dǎo)出的方式。
創(chuàng)新互聯(lián)建站是專業(yè)的池州網(wǎng)站建設(shè)公司,池州接單;提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行池州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
一、Hive數(shù)據(jù)導(dǎo)入方式
這里主要介紹四種:
從本地文件系統(tǒng)中導(dǎo)入數(shù)據(jù)到Hive表;
從HDFS上導(dǎo)入數(shù)據(jù)到Hive表;
從別的表中查詢出相應(yīng)的數(shù)據(jù)并導(dǎo)入到Hive表中;
在創(chuàng)建表的時(shí)候通過從別的表中查詢出相應(yīng)的記錄并插入到所創(chuàng)建的表中。
1、從本地文件系統(tǒng)中導(dǎo)入數(shù)據(jù)到Hive表
基本語法:
load data local inpath 本地文件路徑 into table Hive表名稱;
先在Hive里面創(chuàng)建好表(demo是網(wǎng)上的),如下:
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
這個(gè)表很簡單,只有四個(gè)字段,具體含義我就不解釋了。本地文件系統(tǒng)里面有個(gè)/home/wyp/wyp.txt文件,內(nèi)容如下:
[wyp@master ~]$ cat wyp.txt
1 wyp 25 13188888888888
2 test 30 13888888888888
3 zs 34 899314121
wyp.txt文件中的數(shù)據(jù)列之間是使用\t分割的,可以通過下面的語句將這個(gè)文件里面的數(shù)據(jù)導(dǎo)入到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里面的內(nèi)容導(dǎo)入到wyp表里面去了,可以到wyp表的數(shù)據(jù)目錄下查看,如下命令:
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
需要注意的是:
和我們熟悉的關(guān)系型數(shù)據(jù)庫不一樣,Hive現(xiàn)在還不支持在insert語句里面直接給出一組記錄的文字形式,也就是說,Hive并不支持INSERT INTO …. VALUES形式的語句。
2、HDFS上導(dǎo)入數(shù)據(jù)到Hive表
基本語法:
load data inpath HDFS文件路徑 into table Hive表名稱;
從本地文件系統(tǒng)中將數(shù)據(jù)導(dǎo)入到Hive表的過程中,其實(shí)是先將數(shù)據(jù)臨時(shí)復(fù)制到HDFS的一個(gè)目錄下(典型的情況是復(fù)制到上傳用戶的HDFS home目錄下,比如/home/wyp/),然后再將數(shù)據(jù)從那個(gè)臨時(shí)目錄下移動(dòng)(注意,這里說的是移動(dòng),不是復(fù)制!)到對應(yīng)的Hive表的數(shù)據(jù)目錄里面。既然如此,那么Hive肯定支持將數(shù)據(jù)直接從HDFS上的一個(gè)目錄移動(dòng)到相應(yīng)Hive表的數(shù)據(jù)目錄下,假設(shè)有下面這個(gè)文件/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
上面是需要插入數(shù)據(jù)的內(nèi)容,這個(gè)文件是存放在HDFS上/home/wyp目錄(和一中提到的不同,一中提到的文件是存放在本地文件系統(tǒng)上)里面,我們可以通過下面的命令將這個(gè)文件里面的內(nèi)容導(dǎo)入到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)
從上面的執(zhí)行結(jié)果我們可以看到,數(shù)據(jù)的確導(dǎo)入到wyp表中了!請注意load data inpath ‘/home/wyp/add.txt’ into table wyp;里面是沒有l(wèi)ocal這個(gè)單詞的,這個(gè)是和一中的區(qū)別。
3、從別的表中查詢出相應(yīng)的數(shù)據(jù)并導(dǎo)入到Hive表中
基本語法:
insert into table 目標(biāo)表名稱
[partition (分區(qū)字段=值)]
select 一組字段
from 源表名稱;
假設(shè)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作為了分區(qū)字段。對于分區(qū),這里在做解釋一下:
分區(qū):在Hive中,表的每一個(gè)分區(qū)對應(yīng)表下的相應(yīng)目錄,所有分區(qū)的數(shù)據(jù)都是存儲(chǔ)在對應(yīng)的目錄中。比如wyp表有dt和city兩個(gè)分區(qū),則對應(yīng)dt=20131218,city=BJ對應(yīng)表的目錄為/user/hive/warehouse/dt=20131218/city=BJ,所有屬于這個(gè)分區(qū)的數(shù)據(jù)都存放在這個(gè)目錄中。
下面語句就是將wyp表中的查詢結(jié)果并插入到test表中:
hive> insert into table test
partition (age='25')
select id, name, tel
from wyp;
#########################################
這里輸出了一堆Mapreduce任務(wù)信息,這里省略
#########################################
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)
這里做一下說明:我們知道我們傳統(tǒng)數(shù)據(jù)塊的形式insert into table values(字段1,字段2),這種形式hive是不支持的。
4、在創(chuàng)建表的時(shí)候通過從別的表中查詢出相應(yīng)的記錄并插入到所創(chuàng)建的表中
基本語法:
create table 新表名稱
as
select 一組字段,逗號分隔
from 源表名稱;
在實(shí)際情況中,表的輸出結(jié)果可能太多,不適于顯示在控制臺(tái)上,這時(shí)候,將Hive的查詢輸出結(jié)果直接存在一個(gè)新的表中是非常方便的,我們稱這種情況為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)
數(shù)據(jù)就插入到test4表中去了,CTAS操作是原子的,因此如果select查詢由于某種原因而失敗,新表是不會(huì)創(chuàng)建的!
二、Hive數(shù)據(jù)導(dǎo)出方式
可以根據(jù)導(dǎo)出的地方不一樣,將這些方式分為三種:
導(dǎo)出到本地文件系統(tǒng);
導(dǎo)出到HDFS中;
導(dǎo)出到Hive的另一個(gè)表中。
1、導(dǎo)出到本地文件系統(tǒng)
基本語法:
insert overwrite local directory '本地文件路徑'
select 字段 from Hive表名稱;
將上文表中的數(shù)據(jù)導(dǎo)出本地文件系統(tǒng):
hive> insert overwrite local directory '/home/wyp/wyp'
>select * from wyp;
這條HQL的執(zhí)行需要啟用Mapreduce完成,運(yùn)行完這條語句之后,將會(huì)在本地文件系統(tǒng)的/home/wyp/wyp目錄下生成文件,這個(gè)文件是Reduce產(chǎn)生的結(jié)果。
2、導(dǎo)出到HDFS中
基本語法:
insert overwrite directory 'HDFS文件路徑'
select * from Hive表名稱;
將上文表數(shù)據(jù)導(dǎo)出到HDFS:
hive> insert overwrite directory '/home/wyp/hdfs'
select * from wyp;
將會(huì)在HDFS的/home/wyp/hdfs目錄下保存導(dǎo)出來的數(shù)據(jù)。注意,和導(dǎo)出文件到本地文件系統(tǒng)的HQL少一個(gè)local,數(shù)據(jù)的存放路徑就不一樣了。
3、導(dǎo)出到Hive的另一個(gè)表中
與上文 從別的表中查詢出相應(yīng)的數(shù)據(jù)并導(dǎo)入到Hive表中 一致。