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