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.如果外部表被錯誤刪除,則需要重新建表,及重新創建分區與數據的映射關系。