Hive內部表外部表轉化分析


 

hive表分為內部表和外部表。
外部表在刪除的時候並不會刪除到hdfs中的文件,比較安全,所以對於重要的需要進行分析的日志建議使用外部表進行操作,這樣不會出現誤操作影響到日志的存儲。
內部表在闡述的時候會刪除掉hdfs中的文件,所以一般用於創建臨時表,這樣臨時表在刪除后,也會刪除掉hdfs中的數據。

今天這里主要是對內部表轉化為外部表進行相關的實驗。

試驗一:
建立內部表,導入數據。將內部表修改為外部表,刪除該表。查看是否會刪除掉hdfs中的數據。

 SQL |   復制 | ?  
01  
02
//創建內部表
03
CREATE TABLE tmp.pvlog(ip STRING,CURRENT_DATE STRING,userinfo STRING)
04
partitioned BY(ptDate STRING) ROW format delimited FIELDS TERMINATED BY '\t' ;
05
//上傳數據
06
LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-14.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-14');
07
LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-15.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-15');
08
//修改為外部表
09
USE tmp ;
10
ALTER TABLE pvlog SET TBLPROPERTIES ('EXTERNAL'='TRUE');
11
//查詢
12
SELECT ptdate,COUNT(1) FROM tmp.pvlog  GROUP BY ptdate ;
13
能查詢出數據
14
//刪除該表
15
DROP TABLE pvlog ;
16
//查詢hdfs中的數據
17
bin/hadoop dfs -ls /USER/hive/warehouse/tmp.db/pvlog/ptdate=*
18
能查詢到數據。
19
ALTER TABLE pvlog ADD partition(ptdate='2012-08-14');
20
ALTER TABLE pvlog ADD partition(ptdate='2012-08-15');
21  

結論:hdfs中的數據不會被刪除。
試驗二:
建立內部表,將內部表修改為外部表,通過load data 導入數據。看外部表是否能通過loaddata的方式關聯到hdfs。
 SQL |   復制 | ?  
01  
02
//創建內部表
03
CREATE TABLE tmp.pvlog(ip STRING,CURRENT_DATE STRING,userinfo STRING)
04
partitioned BY(ptDate STRING) ROW format delimited FIELDS TERMINATED BY '\t' ;
05
//修改為外部表
06
USE tmp ;
07
ALTER TABLE pvlog SET TBLPROPERTIES ('EXTERNAL'='TRUE');
08
//上傳數據
09
LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-14.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-14');
10
LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-15.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-15');
11
//
12
//查詢
13
SELECT ptdate,COUNT(1) FROM tmp.pvlog  GROUP BY ptdate ;
14
能查詢出數據
15  

結論:
    1.hdfs中數據可以正常導入。
    2.外部表的分區與hdfs的映射關系還是同內部表一樣,可以正常建立。不用額外的執行add partition來建立連接。
    3.但是他不會重新維護在刪除外部表前已經存在的mapping關系。所以在本實驗中,查詢分區數據信息只會出現度假的數據。

 

實驗三:
創建外部表,通過hadoop的hdfs上傳文件,並以hive增加分區的方式來訪問數據,看是否能正常訪問到數據。

 SQL |   復制 | ?  
01  
02
//創建內部表
03
CREATE TABLE tmp.pvlog(ip STRING,CURRENT_DATE STRING,userinfo STRING)
04
partitioned BY(ptDate STRING) ROW format delimited FIELDS TERMINATED BY '\t' ;
05
//修改為外部表
06
USE tmp ;
07
ALTER TABLE pvlog SET TBLPROPERTIES ('EXTERNAL'='TRUE');
08
//上傳數據
09
bin/hadoop dfs -mkdir /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-14
10
bin/hadoop dfs -mkdir /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-15
11
bin/hadoop dfs -put /home/USER/logs/pvlog2012-08-14.txt /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-14
12
bin/hadoop dfs -put /home/USER/logs/pvlog2012-08-15.txt /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-15
13
//增加分區mapping
14
ALTER TABLE pvlog ADD partition(ptdate='2012-08-14');
15
ALTER TABLE pvlog ADD partition(ptdate='2012-08-15');
16
繼續查詢
17
SELECT ptdate,ptchannel,COUNT(1) FROM tmp.pvlog GROUP BY ptdate,ptchannel ;
18
可以查詢到數據
19  

結論:我們也可以通過hdfs上傳文件,同時手動建立分區映射關系。來導入數據。

 

整體結論:
    1.外部表遠比內部表更加安全。而且上傳數據的方式與以前相同,不需要修改以前的邏輯。
    2.如果外部表被錯誤刪除,則需要重新建表,及重新創建分區與數據的映射關系。


免責聲明!

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



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