傳送門
hadoop入門系列--hive基礎(chǔ)
hadoop入門系列--hive的三種集合數(shù)據(jù)類型array、map身弊、struct以及自定義分隔符示例
hadoop入門系列--hive中array(或map集合類型)的行轉(zhuǎn)多列LATERAL VIEW explode用法
傳送門
一更扁、概念理解
- 不是數(shù)據(jù)庫,更像是adoop的一個工具或者接口。是一個構(gòu)建與Hadoop頂層的數(shù)據(jù)倉庫工具(數(shù)據(jù)倉庫是把所有數(shù)據(jù)都存儲伐割,都聯(lián)系起來诫咱◇舷叮可以存儲所有歷史數(shù)據(jù))
- 本身不存儲和處理數(shù)據(jù)。依賴分布式文件系統(tǒng)HDFS存儲數(shù)據(jù)坎缭,依賴分布式并行計算模型MapReduce處理數(shù)據(jù)
- 定義了簡單的類似SQL的查詢語言---HiveQL
- 用戶可以通過編寫HiveQL語句運(yùn)行MapReduce任務(wù)
二竟痰、在hive數(shù)據(jù)庫中創(chuàng)建表
下面是創(chuàng)建表名為employee,兩個字段分別為id掏呼、name(類型分別為int坏快、String)
hive> create table if not exists employee (id int , name String)
ROW FORMAT DELIMITED //行格式分隔
FIELDS TERMINATED BY '\t' //以'\t'結(jié)尾的字段
LINES TERMINATED BY '\n' //以'\n'結(jié)尾的行
STORED AS TEXTFILE; //存儲為文本文件;
如果創(chuàng)建表成功,能看到以下回應(yīng):
OK
Time taken: 5.905 seconds
hive>
查看表結(jié)構(gòu)
desc student;
快速查看表的行數(shù)(利用EXPLAIN命令憎夷,通過查看查詢的執(zhí)行計劃中的TableScan操作中的Statistics得知數(shù)據(jù)量 )
explain select * from student;
刪除表
drop table student;
三莽鸿、把數(shù)據(jù)導(dǎo)入表中
1)從本地文件系統(tǒng)中導(dǎo)入數(shù)據(jù)到Hive表
hive> load data local inpath 'jobs.txt' into table employee;
需要注意的是:
和我們熟悉的關(guān)系型數(shù)據(jù)庫不一樣,Hive現(xiàn)在還不支持在insert語句里面直接給出一組記錄的文字形式拾给,也就是說祥得,Hive并不支持INSERT INTO …. VALUES形式的語句。
2)HDFS上導(dǎo)入數(shù)據(jù)到Hive表
方法原理:
從本地文件系統(tǒng)中將數(shù)據(jù)導(dǎo)入到Hive表的過程中蒋得,其實是先將數(shù)據(jù)臨時復(fù)制到HDFS的一個目錄下(典型的情況是復(fù)制到上傳用戶的HDFS home目錄下,比如/home/wyp/)级及,然后再將數(shù)據(jù)從那個臨時目錄下移動(注意,這里說的是移動额衙,不是復(fù)制R埂)到對應(yīng)的Hive表的數(shù)據(jù)目錄里面。既然如此窍侧,那么Hive肯定支持將數(shù)據(jù)直接從HDFS上的一個目錄移動到相應(yīng)Hive表的數(shù)據(jù)目錄下县踢,假設(shè)有下面這個文件/home/wyp/jobs.txt,具體的操作如下:
hive> load data inpath '/home/wyp/jobs.txt' into table employee;
hive> select * from employee;
從上面的執(zhí)行結(jié)果我們可以看到伟件,數(shù)據(jù)的確導(dǎo)入到wyp表中了硼啤!請注意load data inpath ‘/home/wyp/employee.txt’ into table employee;里面是沒有l(wèi)ocal這個單詞的,這個是和方法1的區(qū)別锋爪。
3)從別的表中查詢出相應(yīng)的數(shù)據(jù)并導(dǎo)入到Hive表中
#wyp表
hive> create table test (id int , name String,age init,tel String)
ROW FORMAT DELIMITED //行格式分隔
FIELDS TERMINATED BY '\t' //以'\t'結(jié)尾的字段
LINES TERMINATED BY '\n' //以'\n'結(jié)尾的行
STORED AS TEXTFILE; //存儲為文本文件;
#假設(shè)Hive中有test表丙曙,其建表語句如下所示:
hive> create table test (id int , name String,tel String)
partitioned by
(age int)
ROW FORMAT DELIMITED //行格式分隔
FIELDS TERMINATED BY '\t' //以'\t'結(jié)尾的字段
LINES TERMINATED BY '\n' //以'\n'結(jié)尾的行
STORED AS TEXTFILE; //存儲為文本文件;
大體和wyp表的建表語句類似,只不過test表里面用age作為了分區(qū)字段其骄。對于分區(qū)亏镰,這里在做解釋一下:
分區(qū):在Hive中,表的每一個分區(qū)對應(yīng)表下的相應(yīng)目錄拯爽,所有分區(qū)的數(shù)據(jù)都是存儲在對應(yīng)的目錄中索抓。比如wyp表有dt和city兩個分區(qū),則對應(yīng)dt=20131218,city=BJ對應(yīng)表的目錄為/user/hive/warehouse/dt=20131218/city=BJ,所有屬于這個分區(qū)的數(shù)據(jù)都存放在這個目錄中逼肯。
//下面語句就是將wyp表中的查詢結(jié)果并插入到test表中:
hive> insert into table test
> partition (age='25')
> select id, name
> from wyp;
hive> select * from test;
//打印結(jié)果
4 wyp4 25
1 wyp 25
2 test 25
3 zs 25
- 這里做一下說明:
我們知道我們傳統(tǒng)數(shù)據(jù)塊的形式insert into table values(字段1耸黑,字段2),這種形式hive是不支持的篮幢。- 通過上面的輸出大刊,我們可以看到從wyp表中查詢出來的東西已經(jīng)成功插入到test表中去了!如果目標(biāo)表(test)中不存在分區(qū)字段三椿,可以去掉partition (age=’25′)語句缺菌。
通過上面的輸出,我們可以看到從wyp表中查詢出來的東西已經(jīng)成功插入到test表中去了搜锰!如果目標(biāo)表(test)中不存在分區(qū)字段伴郁,可以去掉partition (age=’25′)語句。當(dāng)然蛋叼,我們也可以在select語句里面通過使用分區(qū)值來動態(tài)指明分區(qū):
hive> set hive.exec.dynamic.partition.mode=nonstrict;
hive> insert into table test
> partition (age)
> select id, name,
> tel, age
> from wyp;
#####################################################################
這里輸出了一堆Mapreduce任務(wù)信息焊傅,這里省略
#####################################################################
Total MapReduce CPU Time Spent: 1 seconds 510 msec
OK
Time taken: 17.712 seconds
hive> select * from test;
OK
5 wyp1 131212121212 23
6 wyp2 134535353535 24
7 wyp3 132453535353 25
1 wyp 13188888888888 25
8 wyp4 154243434355 26
2 test 13888888888888 30
3 zs 899314121 34
Time taken: 0.399 seconds, Fetched: 7 row(s)
- 這種方法叫做動態(tài)分區(qū)插入,但是Hive中默認(rèn)是關(guān)閉的狈涮,所以在使用前需要先把hive.exec.dynamic.partition.mode設(shè)置為nonstrict狐胎。當(dāng)然,Hive也支持insert overwrite方式來插入數(shù)據(jù)薯嗤,從字面我們就可以看出顽爹,overwrite是覆蓋的意思纤泵,是的骆姐,執(zhí)行完這條語句的時候,相應(yīng)數(shù)據(jù)目錄下的數(shù)據(jù)將會被覆蓋捏题!而insert into則不會玻褪,注意兩者之間的區(qū)別。例子如下:
hive> insert overwrite table test
> PARTITION (age)
> select id, name, tel, age
> from wyp;
- 更可喜的是公荧,Hive還支持多表插入带射,什么意思呢?在Hive中循狰,我們可以把insert語句倒過來窟社,把from放在最前面,它的執(zhí)行效果和放在后面是一樣的绪钥,如下:
- 可以在同一個查詢中使用多個insert子句灿里,這樣的好處是我們只需要掃描一遍源表就可以生成多個不相交的輸出。這個很酷吧程腹!
hive> show create table test3;
OK
CREATE TABLE test3(
id int,
name string)
Time taken: 0.277 seconds, Fetched: 18 row(s)
hive> from wyp
> insert into table test
> partition(age)
> select id, name, tel, age
> insert into table test3
> select id, name
> where age>25;
hive> select * from test3;
OK
8 wyp4
2 test
3 zs
Time taken: 4.308 seconds, Fetched: 3 row(s)
4)在創(chuàng)建表的時候通過從別的表中查詢出相應(yīng)的記錄并插入到所創(chuàng)建的表中
- 在實際情況中匣吊,表的輸出結(jié)果可能太多,不適于顯示在控制臺上,這時候色鸳,將Hive的查詢輸出結(jié)果直接存在一個新的表中是非常方便的社痛,我們稱這種情況為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查詢由于某種原因而失敗蒜哀,新表是不會創(chuàng)建的!
4)練習(xí):請基于Job職位表數(shù)據(jù)吏砂,在HIVE中創(chuàng)建一個job表凡怎,然后將job數(shù)據(jù)加載到該表,并可以做查詢使用赊抖。
注:這里把數(shù)據(jù)導(dǎo)入hive的employee表统倒,命令可參考上面的本地導(dǎo)入和hdfs導(dǎo)入兩種方法