http://www.aboutyun.com/thread-7458-1-1.html
1.創建內部表與外部表的區別是什么? 2.external關鍵字的作用是什么? 3.外部表與內部表的區別是什么? 4.刪除表的時候,內部表與外部表有什么區別? 5.load data local inpath '/home/wyp/data/wyp.txt' into table wyp;的過程是什么樣子的? 6.磁盤,hdfs,hive表他們之間的過程是什么樣子的? ![]() 好了,進入正題。今天我們要探討的話題是Hive的里面的表與外部表兩個概念,以及如何在Hive里面創建表和外部表,它們之間有什么區別等話題。在本博客的 讓你徹底明白hive數據存儲各種模式文章里面我們談到了Hive的數據存儲模式,里面簡單的說到Hive中表以及外部表的簡單概念,相信很多讀者對這些概念還不是很了解,今天就給大家科普一下,希望對大家有所幫助。 相信很多用戶都用過關系型數據庫,我們可以在關系型數據庫里面創建表(create table),這里要討論的表和關系型數據庫中的表在概念上很類似。我們可以用下面的語句在Hive里面創建一個表:
注意:/home/wyp/data/路徑是Linux本地文件系統路徑;而/home/hdfs/是HDFS文件系統上面的路徑!從上面的輸出我們可以看到數據是先從本地的/home/wyp/data/文件夾下復制到HDFS上的/home/hdfs/wyp.txt(這個是Hive中的配置導致的)文件中!最后Hive將從HDFS上把數據移動到wyp表中!移到表中的數據到底存放在HDFS的什么地方?其實在Hive的${HIVE_HOME}/conf/hive-site.xml配置文件的hive.metastore.warehouse.dir屬性指向的就是Hive表數據存放的路徑(在我的店電腦里面配置是/user/hive/warehouse),而Hive每創建一個表都會在hive.metastore.warehouse.dir指向的目錄下以表名創建一個文件夾,所有屬於這個表的數據都存放在這個文件夾里面。所以,剛剛導入到wyp表的數據都存放在/user/hive/warehouse/wyp/文件夾中,我們可以去看看:
看到沒,上面的命令就是顯示HDFS上的/user/hive/warehouse/wyp中的所有內容。如果需要刪除wyp表,可以用下面的命令:
從上面的輸出Moved: ‘hdfs://mycluster/user/hive/warehouse/wyp’ to trash at: hdfs://mycluster/user/hdfs/.Trash/Current我們可以得知,原來屬於wyp表的數據被移到hdfs://mycluster/user/hdfs/.Trash/Current文件夾中(如果你的Hadoop沒有取用垃圾箱機制,那么drop table wyp命令將會把屬於wyp表的所有數據全部刪除!),其實就是刪掉了屬於wyp表的數據。記住這些,因為這些和外部表有很大的不同。同時,屬於表wyp的元數據也全部刪除了! 我們再來創建一個外部表:
仔細觀察一下創建表和外部表的區別,仔細的同學們一個會發現創建外部表多了external關鍵字說明以及location ‘/home/wyp/external’。是的,你說對了!如果你需要創建外部表,需要在創建表的時候加上external關鍵字,同時指定外部表存放數據的路徑(當然,你也可以不指定外部表的存放路徑,這樣Hive將在HDFS上的/user/hive/warehouse/文件夾下以外部表的表名創建一個文件夾,並將屬於這個表的數據存放在這里):
和上面的導入數據到表一樣,將本地的數據導入到外部表,數據也是從本地文件系統復制到HDFS中/home/hdfs/wyp.txt文件中,但是,最后數據不是移動到外部表的/user/hive/warehouse/exter_table文件夾中(除非你創建表的時候沒有指定數據的存放路徑)!大家可以去HDFS上看看!對於外部表,數據是被移動到創建表時指定的目錄(本例是存放在/home/wyp/external文件夾中)!如果你要刪除外部表,看看下面的操作:
你會發現刪除外部表的時候,數據並沒有被刪除,這是和刪除表的數據完全不一樣的! 最后歸納一下Hive中表與外部表的區別: 1、在導入數據到外部表,數據並沒有移動到自己的數據倉庫目錄下,也就是說外部表中的數據並不是由它自己來管理的!而表則不一樣; 2、在刪除表的時候,Hive將會把屬於表的元數據和數據全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元數據,數據是不會刪除的! 那么,應該如何選擇使用哪種表呢?在大多數情況沒有太多的區別,因此選擇只是個人喜好的問題。但是作為一個經驗,如果所有處理都需要由Hive完成,那么你應該創建表,否則使用外部表! |