转:
表分为内部表和外部表。
外部表在删除的时候并不会删除到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/ dfs -ls /USER//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 |
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 |
实验三:
创建外部表,通过的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/ 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 |
整体结论:
1.外部表远比内部表更加安全。而且上传数据的方式与以前相同,不需要修改以前的逻辑。 2.如果外部表被错误删除,则需要重新建表,及重新创建分区与数据的映射关系。