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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值