問題導(dǎo)讀:
1.創(chuàng)建內(nèi)部表與外部表的區(qū)別是什么塘淑?
2.external關(guān)鍵字的作用是什么?
3.外部表與內(nèi)部表的區(qū)別是什么蚂斤?
4.刪除表的時(shí)候存捺,內(nèi)部表與外部表有什么區(qū)別?
5.load data local inpath '/home/wyp/data/wyp.txt' into table wyp;的過程是什么樣子的曙蒸?
6.磁盤捌治,hdfs,hive表他們之間的過程是什么樣子的?
好了纽窟,進(jìn)入正題肖油。今天我們要探討的話題是Hive的里面的表與外部表兩個(gè)概念,以及如何在Hive里面創(chuàng)建表和外部表臂港,它們之間有什么區(qū)別等話題森枪。在本博客的 讓你徹底明白hive數(shù)據(jù)存儲各種模式文章里面我們談到了Hive的數(shù)據(jù)存儲模式,里面簡單的說到Hive中表以及外部表的簡單概念审孽,相信很多讀者對這些概念還不是很了解县袱,今天就給大家科普一下,希望對大家有所幫助瓷胧。
相信很多用戶都用過關(guān)系型數(shù)據(jù)庫显拳,我們可以在關(guān)系型數(shù)據(jù)庫里面創(chuàng)建表(create table),這里要討論的表和關(guān)系型數(shù)據(jù)庫中的表在概念上很類似搓萧。我們可以用下面的語句在Hive里面創(chuàng)建一個(gè)表:
hive> create table wyp(id int,
name string,
age int,
tele string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
OK
Time taken: 0.759 seconds
復(fù)制代碼
這樣我們就在Hive里面創(chuàng)建了一張普通的表杂数,現(xiàn)在我們給這個(gè)表導(dǎo)入數(shù)據(jù):
hive> load data local inpath '/home/wyp/data/wyp.txt' into table wyp;
Copying data from file:/home/wyp/data/wyp.txt
Copying file: file:/home/hdfs/wyp.txt
Loading data to table default.wyp
Table default.wyp stats: [num_partitions: 0, num_files: 1,
num_rows: 0, total_size: 67, raw_data_size: 0]
OK
Time taken: 3.289 seconds
hive> select * from wyp;
OK
1 wyp 25 13188888888888
2 test 30 13888888888888
3 zs 34 899314121
Time taken: 0.41 seconds, Fetched: 3 row(s)
復(fù)制代碼
注意:/home/wyp/data/路徑是Linux本地文件系統(tǒng)路徑;而/home/hdfs/是HDFS文件系統(tǒng)上面的路徑瘸洛!從上面的輸出我們可以看到數(shù)據(jù)是先從本地的/home/wyp/data/文件夾下復(fù)制到HDFS上的/home/hdfs/wyp.txt(這個(gè)是Hive中的配置導(dǎo)致的)文件中揍移!最后Hive將從HDFS上把數(shù)據(jù)移動到wyp表中!移到表中的數(shù)據(jù)到底存放在HDFS的什么地方反肋?其實(shí)在Hive的${HIVE_HOME}/conf/hive-site.xml配置文件的hive.metastore.warehouse.dir屬性指向的就是Hive表數(shù)據(jù)存放的路徑(在我的店電腦里面配置是/user/hive/warehouse)那伐,而Hive每創(chuàng)建一個(gè)表都會在hive.metastore.warehouse.dir指向的目錄下以表名創(chuàng)建一個(gè)文件夾,所有屬于這個(gè)表的數(shù)據(jù)都存放在這個(gè)文件夾里面。所以罕邀,剛剛導(dǎo)入到wyp表的數(shù)據(jù)都存放在/user/hive/warehouse/wyp/文件夾中畅形,我們可以去看看:
hive> dfs -ls /user/hive/warehouse/wyp ;
Found 1 items
-rw-r--r-- 3 wyp supergroup 67 2014-01-14 22:23 /user/hive/warehouse/wyp/wyp.txt
復(fù)制代碼
看到?jīng)],上面的命令就是顯示HDFS上的/user/hive/warehouse/wyp中的所有內(nèi)容诉探。如果需要刪除wyp表日熬,可以用下面的命令:
hive> drop table wyp;
Moved: 'hdfs://mycluster/user/hive/warehouse/wyp' to
OK
Time taken: 2.503 seconds
復(fù)制代碼
從上面的輸出Moved: ‘hdfs://mycluster/user/hive/warehouse/wyp’ to trash at: hdfs://mycluster/user/hdfs/.Trash/Current我們可以得知,原來屬于wyp表的數(shù)據(jù)被移到hdfs://mycluster/user/hdfs/.Trash/Current文件夾中(如果你的Hadoop沒有取用垃圾箱機(jī)制肾胯,那么drop table wyp命令將會把屬于wyp表的所有數(shù)據(jù)全部刪除J),其實(shí)就是刪掉了屬于wyp表的數(shù)據(jù)敬肚。記住這些毕荐,因?yàn)檫@些和外部表有很大的不同。同時(shí)艳馒,屬于表wyp的元數(shù)據(jù)也全部刪除了憎亚!
我們再來創(chuàng)建一個(gè)外部表:
hive> create external table exter_table(
id int,
name string,
age int,
tel string)
location '/home/wyp/external';
OK
Time taken: 0.098 seconds
復(fù)制代碼
仔細(xì)觀察一下創(chuàng)建表和外部表的區(qū)別,仔細(xì)的同學(xué)們一個(gè)會發(fā)現(xiàn)創(chuàng)建外部表多了external關(guān)鍵字說明以及l(fā)ocation ‘/home/wyp/external’鹰溜。是的虽填,你說對了!如果你需要創(chuàng)建外部表曹动,需要在創(chuàng)建表的時(shí)候加上external關(guān)鍵字,同時(shí)指定外部表存放數(shù)據(jù)的路徑(當(dāng)然牲览,你也可以不指定外部表的存放路徑墓陈,這樣Hive將在HDFS上的/user/hive/warehouse/文件夾下以外部表的表名創(chuàng)建一個(gè)文件夾,并將屬于這個(gè)表的數(shù)據(jù)存放在這里):
hive> load data local inpath '/home/wyp/data/wyp.txt' into table exter_table;
Copying data from file:/home/wyp/data/wyp.txt
Copying file: file:/home/hdfs/wyp.txt
Loading data to table default.exter_table
Table default.exter_table stats: [num_partitions: 0, num_files:
1, num_rows: 0, total_size: 67, raw_data_size: 0]
OK
Time taken: 0.456 seconds
復(fù)制代碼
和上面的導(dǎo)入數(shù)據(jù)到表一樣第献,將本地的數(shù)據(jù)導(dǎo)入到外部表贡必,數(shù)據(jù)也是從本地文件系統(tǒng)復(fù)制到HDFS中/home/hdfs/wyp.txt文件中,但是庸毫,最后數(shù)據(jù)不是移動到外部表的/user/hive/warehouse/exter_table文件夾中(除非你創(chuàng)建表的時(shí)候沒有指定數(shù)據(jù)的存放路徑)仔拟!大家可以去HDFS上看看!對于外部表飒赃,數(shù)據(jù)是被移動到創(chuàng)建表時(shí)指定的目錄(本例是存放在/home/wyp/external文件夾中)利花!如果你要刪除外部表,看看下面的操作:
hive> drop table exter_table;
OK
Time taken: 0.093 seconds
復(fù)制代碼
和上面刪除Hive的表對比可以發(fā)現(xiàn)载佳,沒有輸出將數(shù)據(jù)從一個(gè)地方移到任一個(gè)地方炒事!那是不是刪除外部表的的時(shí)候數(shù)據(jù)直接被刪除掉呢?答案不是這樣的:
hive> dfs -ls /home/wyp/external;
Found 1 items
-rw-r--r-- 3 wyp supergroup 67 2014-01-14 23:21 /home/wyp/external/wyp.txt
復(fù)制代碼
你會發(fā)現(xiàn)刪除外部表的時(shí)候蔫慧,數(shù)據(jù)并沒有被刪除挠乳,這是和刪除表的數(shù)據(jù)完全不一樣的!
最后歸納一下Hive中表與外部表的區(qū)別:
1、在導(dǎo)入數(shù)據(jù)到外部表睡扬,數(shù)據(jù)并沒有移動到自己的數(shù)據(jù)倉庫目錄下盟蚣,也就是說外部表中的數(shù)據(jù)并不是由它自己來管理的!而表則不一樣卖怜;
2刁俭、在刪除表的時(shí)候,Hive將會把屬于表的元數(shù)據(jù)和數(shù)據(jù)全部刪掉韧涨;而刪除外部表的時(shí)候牍戚,Hive僅僅刪除外部表的元數(shù)據(jù),數(shù)據(jù)是不會刪除的虑粥!
那么如孝,應(yīng)該如何選擇使用哪種表呢?在大多數(shù)情況沒有太多的區(qū)別娩贷,因此選擇只是個(gè)人喜好的問題第晰。但是作為一個(gè)經(jīng)驗(yàn),如果所有處理都需要由Hive完成彬祖,那么你應(yīng)該創(chuàng)建表茁瘦,否則使用外部表!
轉(zhuǎn):https://blog.csdn.net/bbbeoy/article/details/62233125