hive內(nèi)部表與外部表區(qū)別詳細(xì)介紹

問題導(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ù)存儲(chǔ)各種模式文章里面我們談到了Hive的數(shù)據(jù)存儲(chǔ)模式,里面簡(jiǎn)單的說到Hive中表以及外部表的簡(jiǎn)單概念,相信很多讀者對(duì)這些概念還不是很了解,今天就給大家科普一下,希望對(duì)大家有所幫助。
  相信很多用戶都用過關(guān)系型數(shù)據(jù)庫(kù),我們可以在關(guān)系型數(shù)據(jù)庫(kù)里面創(chuàng)建表(create table),這里要討論的表和關(guān)系型數(shù)據(jù)庫(kù)中的表在概念上很類似。我們可以用下面的語(yǔ)句在Hive里面創(chuàng)建一個(gè)表:

  1. hive> create table wyp(id int,

  2. name string,

  3. age int,

  4. tele string)

  5. ROW FORMAT DELIMITED

  6. FIELDS TERMINATED BY '\t'

  7. STORED AS TEXTFILE;

  8. OK

  9. Time taken: 0.759 seconds

復(fù)制代碼

這樣我們就在Hive里面創(chuàng)建了一張普通的表,現(xiàn)在我們給這個(gè)表導(dǎo)入數(shù)據(jù):

  1. hive> load data local inpath '/home/wyp/data/wyp.txt' into table wyp;

  2. Copying data from file:/home/wyp/data/wyp.txt

  3. Copying file: file:/home/hdfs/wyp.txt

  4. Loading data to table default.wyp

  5. Table default.wyp stats: [num_partitions: 0, num_files: 1,

  6. num_rows: 0, total_size: 67, raw_data_size: 0]

  7. OK

  8. Time taken: 3.289 seconds

  9. hive> select * from wyp;

  10. OK

  11. 1 wyp 25 13188888888888

  12. 2 test 30 13888888888888

  13. 3 zs 34 899314121

  14. 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ù)移動(dòng)到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è)表都會(huì)在hive.metastore.warehouse.dir指向的目錄下以表名創(chuàng)建一個(gè)文件夾,所有屬于這個(gè)表的數(shù)據(jù)都存放在這個(gè)文件夾里面。所以,剛剛導(dǎo)入到wyp表的數(shù)據(jù)都存放在/user/hive/warehouse/wyp/文件夾中,我們可以去看看:

  1. hive> dfs -ls /user/hive/warehouse/wyp ;

  2. Found 1 items

  3. -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)容。如果需要?jiǎng)h除wyp表,可以用下面的命令:

  1. hive> drop table wyp;

  2. Moved: 'hdfs://mycluster/user/hive/warehouse/wyp' to

  3. trash at: hdfs://mycluster/user/hdfs/.Trash/Current

  4. OK

  5. Time taken: 2.503 seconds

復(fù)制代碼

從上面的輸出Moved: ‘hdfs://mycluster/user/hive/warehouse/wyp’ to trash at: hdfs://mycluster/user/hdfs/.Trash/Current我們可以得知,原來(lái)屬于wyp表的數(shù)據(jù)被移到hdfs://mycluster/user/hdfs/.Trash/Current文件夾中(如果你的Hadoop沒有取用垃圾箱機(jī)制,那么drop table wyp命令將會(huì)把屬于wyp表的所有數(shù)據(jù)全部刪除!),其實(shí)就是刪掉了屬于wyp表的數(shù)據(jù)。記住這些,因?yàn)檫@些和外部表有很大的不同。同時(shí),屬于表wyp的元數(shù)據(jù)也全部刪除了!
我們?cè)賮?lái)創(chuàng)建一個(gè)外部表:

  1. hive> create external table exter_table(

  2. id int,

  3. name string,

  4. age int,

  5. tel string)

  6. location '/home/wyp/external';

  7. OK

  8. Time taken: 0.098 seconds

復(fù)制代碼

仔細(xì)觀察一下創(chuàng)建表和外部表的區(qū)別,仔細(xì)的同學(xué)們一個(gè)會(huì)發(fā)現(xiàn)創(chuàng)建外部表多了external關(guān)鍵字說明以及l(fā)ocation ‘/home/wyp/external’。是的,你說對(duì)了!如果你需要?jiǎng)?chuàng)建外部表,需要在創(chuàng)建表的時(shí)候加上external關(guān)鍵字,同時(shí)指定外部表存放數(shù)據(jù)的路徑(當(dāng)然,你也可以不指定外部表的存放路徑,這樣Hive將在HDFS上的/user/hive/warehouse/文件夾下以外部表的表名創(chuàng)建一個(gè)文件夾,并將屬于這個(gè)表的數(shù)據(jù)存放在這里):

  1. hive> load data local inpath '/home/wyp/data/wyp.txt' into table exter_table;

  2. Copying data from file:/home/wyp/data/wyp.txt

  3. Copying file: file:/home/hdfs/wyp.txt

  4. Loading data to table default.exter_table

  5. Table default.exter_table stats: [num_partitions: 0, num_files:

  6. 1, num_rows: 0, total_size: 67, raw_data_size: 0]

  7. OK

  8. 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ù)不是移動(dòng)到外部表的/user/hive/warehouse/exter_table文件夾中(除非你創(chuàng)建表的時(shí)候沒有指定數(shù)據(jù)的存放路徑)!大家可以去HDFS上看看!對(duì)于外部表,數(shù)據(jù)是被移動(dòng)到創(chuàng)建表時(shí)指定的目錄(本例是存放在/home/wyp/external文件夾中)!如果你要?jiǎng)h除外部表,看看下面的操作:

  1. hive> drop table exter_table;

  2. OK

  3. Time taken: 0.093 seconds

復(fù)制代碼

和上面刪除Hive的表對(duì)比可以發(fā)現(xiàn),沒有輸出將數(shù)據(jù)從一個(gè)地方移到任一個(gè)地方!那是不是刪除外部表的的時(shí)候數(shù)據(jù)直接被刪除掉呢?答案不是這樣的:

  1. hive> dfs -ls /home/wyp/external;

  2. Found 1 items

  3. -rw-r--r-- 3 wyp supergroup 67 2014-01-14 23:21 /home/wyp/external/wyp.txt

復(fù)制代碼

你會(huì)發(fā)現(xiàn)刪除外部表的時(shí)候,數(shù)據(jù)并沒有被刪除,這是和刪除表的數(shù)據(jù)完全不一樣的!

最后歸納一下Hive中表與外部表的區(qū)別:
1、在導(dǎo)入數(shù)據(jù)到外部表,數(shù)據(jù)并沒有移動(dòng)到自己的數(shù)據(jù)倉(cāng)庫(kù)目錄下,也就是說外部表中的數(shù)據(jù)并不是由它自己來(lái)管理的!而表則不一樣;
2、在刪除表的時(shí)候,Hive將會(huì)把屬于表的元數(shù)據(jù)和數(shù)據(jù)全部刪掉;而刪除外部表的時(shí)候,Hive僅僅刪除外部表的元數(shù)據(jù),數(shù)據(jù)是不會(huì)刪除的!
那么,應(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容