hive內部表與外部表區別詳細介紹


 

 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里面創建一個表:


  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
復制代碼
這樣我們就在Hive里面創建了一張普通的表,現在我們給這個表導入數據:

  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)
復制代碼

注意:/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/文件夾中,我們可以去看看:


  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
復制代碼

看到沒,上面的命令就是顯示HDFS上的/user/hive/warehouse/wyp中的所有內容。如果需要刪除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
復制代碼


從上面的輸出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的元數據也全部刪除了!
我們再來創建一個外部表:


  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
復制代碼

仔細觀察一下創建表和外部表的區別,仔細的同學們一個會發現創建外部表多了external關鍵字說明以及location ‘/home/wyp/external’。是的,你說對了!如果你需要創建外部表,需要在創建表的時候加上external關鍵字,同時指定外部表存放數據的路徑(當然,你也可以不指定外部表的存放路徑,這樣Hive將在HDFS上的/user/hive/warehouse/文件夾下以外部表的表名創建一個文件夾,並將屬於這個表的數據存放在這里):

  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
復制代碼

和上面的導入數據到表一樣,將本地的數據導入到外部表,數據也是從本地文件系統復制到HDFS中/home/hdfs/wyp.txt文件中,但是,最后數據不是移動到外部表的/user/hive/warehouse/exter_table文件夾中(除非你創建表的時候沒有指定數據的存放路徑)!大家可以去HDFS上看看!對於外部表,數據是被移動到創建表時指定的目錄(本例是存放在/home/wyp/external文件夾中)!如果你要刪除外部表,看看下面的操作:

  1. hive> drop table exter_table;
  2. OK
  3. Time taken: 0.093 seconds
復制代碼
和上面刪除Hive的表對比可以發現,沒有輸出將數據從一個地方移到任一個地方!那是不是刪除外部表的的時候數據直接被刪除掉呢?答案不是這樣的:

  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
復制代碼

你會發現刪除外部表的時候,數據並沒有被刪除,這是和刪除表的數據完全不一樣的!

最后歸納一下Hive中表與外部表的區別:
1、在導入數據到外部表,數據並沒有移動到自己的數據倉庫目錄下,也就是說外部表中的數據並不是由它自己來管理的!而表則不一樣;
2、在刪除表的時候,Hive將會把屬於表的元數據和數據全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元數據,數據是不會刪除的!
那么,應該如何選擇使用哪種表呢?在大多數情況沒有太多的區別,因此選擇只是個人喜好的問題。但是作為一個經驗,如果所有處理都需要由Hive完成,那么你應該創建表,否則使用外部表!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM