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.如果外部表被错误删除,则需要重新建表,及重新创建分区与数据的映射关系。

原文地址:https://www.cnblogs.com/tangtianfly/p/2876637.html