Hadoop(二十五)Hive內(nèi)部表和外部表

1.查看mysql中metastore數(shù)據(jù)存儲結(jié)構(gòu)

Metastore中只保存了表的描述信息(名字,列,類型,對應目錄

使用SQLYog連接itcast05 的mysql數(shù)據(jù)庫

這里寫圖片描述

查看hive數(shù)據(jù)庫的表結(jié)構(gòu):

這里寫圖片描述

2.建表(默認是內(nèi)部表(先建表忿项,后有數(shù)據(jù)))

(建表時必須指定列的分隔符)

create table trade_detail(
id bigint, 
account string, 
income double, 
expenses double, 
time string) 
row format delimited fields terminated by '\t';

3.Hive狀態(tài)下執(zhí)行Hadoop hdfs命令

在使用hive shell 的時候,我們有時候需要操作hdfs
Hive為我們提供了在hive命令行下hdfs的shell:
城舞,例如:

dfs  -ls  /; 
dfs -mkdir  /data;
dfs  -put  /root/student.txt;

用法和hdfs下是一樣的轩触,只是細微的差別
和Hadoop命令稍微有些差別,前面是dfs開頭,后面以“;”結(jié)尾

4.創(chuàng)建–外部表(先有數(shù)據(jù)家夺,后建表)

先上傳數(shù)據(jù)文件 a.txt b.txthdfs:/data目錄下脱柱,
a.txtb.txt 中的內(nèi)容都是:

這里寫圖片描述

后執(zhí)行創(chuàng)建表的命令:

create external table ext_student (
id int,
name string) 
row format delimited fields terminated by '\t' 
location '/data';

創(chuàng)建完成后使用命令:select * from ext_student; 查看表中內(nèi)容:

這里寫圖片描述

再次上傳數(shù)據(jù)文件 pep.avi 

這里寫圖片描述

到 hdfs:/data 目錄下,后執(zhí)行全表掃描:select * from ext_student;

這里寫圖片描述

說明:只要將這個數(shù)據(jù)放到 hdfs:/data 表所指定的目錄下拉馋,hive就能將這個表中的數(shù)據(jù)讀取出來(內(nèi)部表和外部表都支持榨为,但也存在特殊情況讀不出)

為什么把文件丟到對應目錄下就能把數(shù)據(jù)讀出來?

答:因為metastore記錄了這張表和數(shù)據(jù)的映射關系

SDS表中的內(nèi)容:


這里寫圖片描述

5.創(chuàng)建–分區(qū)表

建分區(qū)表是為了提高數(shù)據(jù)的查詢效率煌茴,按照省份随闺、年份、月份等分區(qū)

創(chuàng)建一個外部分區(qū)表(External Table )
(表名:beauties 指向文件:beauty)

create external table beauties (
id bigint, 
name string, 
size double) 
partitioned by (nation string) 
row format delimited fields terminated by ‘\t’ 
location ‘/beauty’ ;

show create table beauties;  

執(zhí)行完成之后發(fā)現(xiàn)hdfs根目錄下有beauty文件夾蔓腐。

準備好3個數(shù)據(jù)文件: b.c b.j b.a


這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

載入數(shù)據(jù)文件矩乐,同時指定分區(qū):

load data local inpath '/root/b.c' into table beauties partition (nation='China');

查看表中是否成功load數(shù)據(jù):


這里寫圖片描述

突發(fā)奇想:能否像平常使用外部表一樣,在 hdfs:/beauty 目錄下創(chuàng)建一個文件夾 nation=Japan ,然后將b.j 文件上傳到這個目錄下,數(shù)據(jù)就可以查出來了回论?

答:不行散罕! 因為在載入數(shù)據(jù)的時候,metastore是不知道你將這個文件放到 /beauty/nation=Japan/ 目錄下的傀蓉。

拯救方法:通知hive在元數(shù)據(jù)庫中添加一個beauties表的分區(qū)記錄

alter table beauties add partition (nation=’Japan’) location “/beauty/nation=Japan/”

添加分區(qū)后笨使,metastore中SDS表多了一條 記錄:

這里寫圖片描述

再次查詢beauties表,發(fā)現(xiàn)b.j中的數(shù)據(jù)也能查詢出來了:

分區(qū)表的使用優(yōu)勢:

select * from beauties where nation=’China’;

在數(shù)據(jù)量很大的時候僚害,建分區(qū)表可以提高查詢效率硫椰,就不需要將整張表數(shù)據(jù)篩選對比之后再輸出,因為數(shù)據(jù)在hdfs中直接是以分區(qū)存儲的萨蚕,所以使用類似”nation”等分區(qū)字段是可以直接把數(shù)據(jù)取出的

刪除分區(qū):

alter table beauties drop if exists partition (nation ='Japan') ;

注:這里的 if exists 字段呢靶草,是一個檢查分區(qū)是否存在的字段,存在則刪除岳遥,不存在也不會報錯說分區(qū)不存在啦

建內(nèi)部分區(qū)表(Managed Table)

create table td_part(
id bigint, 
account string, 
income double, 
expenses double, 
time string) 
partitioned by (logdate string) 
row format delimited fields terminated by '\t';

普通表和分區(qū)表區(qū)別:有大量數(shù)據(jù)增加的需要建分區(qū)表

create table book (
id bigint, 
name string) 
partitioned by (pubdate string) 
row format delimited fields terminated by '\t'; 

分區(qū)表加載數(shù)據(jù)
(hive自己的語法)

load data local inpath './book.txt' 
overwrite into table book 
partition (pubdate='2010-08-22');

local inpath –>從本地磁盤加載奕翔,不是hdfs

overwrite –>以覆蓋的方式將數(shù)據(jù)寫入book表中

以下創(chuàng)建表的方式少了“overwrite”,則是以追加方式將數(shù)據(jù)加載到hive表中:

load data local inpath '/root/data.am' 
into table beauty 
partition (nation="USA");

使用分區(qū)字段查詢表中的數(shù)據(jù)

select nation, avg(size) from beauties group by nation order by avg(size);

6. 表關聯(lián)查詢

查詢舉例:
需求:
  對 trade_detail 按照賬戶進行分組浩蓉,求出每個賬戶的總支出總結(jié)余派继,然后和 user_info 進行表關聯(lián)宾袜,取出名稱。

在mysql中一條查詢語句就能完成關聯(lián)查詢:

select t.account,u.name,t.income, t.expenses, t.surplus 
from user_info u join (
    select account,sum(income) as income,sum(expenses) as expenses,sum(income-expenses) as surplus 
    from trade_detail group by account 
) t 
on u.account = t.account

但是數(shù)據(jù)量一大驾窟,這個查詢過程將變得極其漫長

所以我們使用hive來完成:

a) 首先要將2張表中的數(shù)據(jù)導入hdfs中庆猫,同樣,我們也可以將mysql中的數(shù)據(jù)直接導入到hive表里面:

Mysql中的表:
trade_detail表:

這里寫圖片描述

user_info表:

這里寫圖片描述

b) 在hive中創(chuàng)建表

trade_detail表:

create table trade_detail (
id bigint,
account string,
income string,
expenses string ,
times string) 
row format delimited fields terminated by ‘\t’;

user_info表:

create table user_info (
id int,
account string,
name string,
age int) 
row format delimited fields terminated by ‘\t’;

c) 使用Sqoop 將mysql中trade_detail的數(shù)據(jù)導入hive中

./sqoop import 
--connect jdbc:mysql://192.168.1.102:3306/itcast 
--username root 
--password 123 
--table trade_detail 
--hive-import 
--hive-overwrite 
--hive-table trade_detail 
--fields-terminated-by '\t';

可能會出現(xiàn)如下的錯誤:

這里寫圖片描述

原因是沒有將hive添加到環(huán)境變量
解決:
1)編輯 /etc/profile 文件绅络,添加HIVE_HOME

這里寫圖片描述

2)source /etc/profile 刷新配置

3)使用 which 命令查看是否添加成功:


這里寫圖片描述

ok
4)再次執(zhí)行sqoop命令月培,發(fā)現(xiàn)sqoop導入正在執(zhí)行,可以看到map-reduce工作正在執(zhí)行恩急,在web瀏覽器上查看執(zhí)行完成之后的結(jié)果文件:


這里寫圖片描述

Sqoop導入執(zhí)行成功杉畜!

d) 使用Sqoop 將mysql中user_info的數(shù)據(jù)導入hive的user_info中

./sqoop import 
--connect jdbc:mysql://192.168.1\. 102:3306/itcast 
--username root 
--password 123 
--table user_info 
--hive-import 
--hive-overwrite 
--hive-table user_info 
--fields-terminated-by '\t';

e) hive執(zhí)行關聯(lián)查詢語句之后的結(jié)果:

select t.account,u.name,t.income, t.expenses, t.surplus 
from user_info u join (
    select account,sum(income) as income,sum(expenses) as expenses,sum(income-expenses) as surplus 
    from trade_detail group by account 
) t 
on u.account = t.account;

這里寫圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市衷恭,隨后出現(xiàn)的幾起案子此叠,更是在濱河造成了極大的恐慌,老刑警劉巖随珠,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拌蜘,死亡現(xiàn)場離奇詭異,居然都是意外死亡牙丽,警方通過查閱死者的電腦和手機简卧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烤芦,“玉大人举娩,你說我怎么就攤上這事」孤蓿” “怎么了铜涉?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遂唧。 經(jīng)常有香客問我芙代,道長,這世上最難降的妖魔是什么盖彭? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任纹烹,我火速辦了婚禮,結(jié)果婚禮上召边,老公的妹妹穿的比我還像新娘铺呵。我一直安慰自己,他們只是感情好隧熙,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布片挂。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪音念。 梳的紋絲不亂的頭發(fā)上沪饺,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音闷愤,去河邊找鬼整葡。 笑死,一個胖子當著我的面吹牛肝谭,可吹牛的內(nèi)容都是我干的掘宪。 我是一名探鬼主播蛾扇,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼攘烛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镀首?” 一聲冷哼從身側(cè)響起坟漱,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎更哄,沒想到半個月后芋齿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡成翩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年觅捆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻敌。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡栅炒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出术羔,到底是詐尸還是另有隱情赢赊,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布级历,位于F島的核電站释移,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寥殖。R本人自食惡果不足惜玩讳,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嚼贡。 院中可真熱鬧锋边,春花似錦、人聲如沸编曼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掐场。三九已至往扔,卻和暖如春贩猎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萍膛。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工吭服, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝗罗。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓艇棕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親串塑。 傳聞我的和親對象是個殘疾皇子沼琉,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容