准备测试表两张,相关建表语句如下
其中test_01为内部表,test_02为外部表。
CREATE TABLE IF NOT EXISTS `test_01`(
`id` int,`name` String,`age` INT,`score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
CREATE external TABLE IF NOT EXISTS `test_02`(
`id` int, `name` String,`age` INT,`score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
从Linux上分别load data数据到指定表(两份数据内容完全相同,只是表名不同)
load data local inpath '/usr/wh/test_01.txt' overwrite into table test_01;
load data local inpath '/usr/wh/test_02.txt' overwrite into table test_02;
数据均导入成功,查看相关数据
1 lucy 20 90.0
2 Rose 21 95.0
3 Jack 22 100.0
查看底层HDFS文件数据
[root@nd2 wh]# hadoop fs -cat /user/hive/warehouse/tmp.db/test_01/test_01.txt
1,lucy,20,90
2,Rose,21,95
3,Jack,22,100
[root@nd2 wh]# hadoop fs -cat /user/hive/warehouse/tmp.db/test_02/test_02.txt
1,lucy,20,90
2,Rose,21,95
3,Jack,22,100
发现数据均被上传到HDFS上
删除load data数据(这里我们直接删除表)
drop table test_01;
drop table test_02;
删除表之后,我们再次查看
[root@nd2 wh]# hadoop fs -ls /user/hive/warehouse/tmp.db/test_01
ls: `/user/hive/warehouse/tmp.db/test_01': No such file or directory
[root@nd2 wh]# hadoop fs -ls /user/hive/warehouse/tmp.db/test_02
Found 1 items
-rwxrwxrwt 3 root hive 40 2019-05-27 11:06 /user/hive/warehouse/tmp.db/test_02/test_02.txt
这里我们发现内部表的HDFS文件被删除,外部表的HDFS文件被保留。
再次新建这两张测试表,不做任何操作,我们发现test_02表已经有了之前的数据。
hive> select * from test_01;
OK
Time taken: 0.123 seconds
hive> select * from test_02;
OK
1 lucy 20 90.0
2 Rose 21 95.0
3 Jack 22 100.0
Time taken: 0.063 seconds, Fetched: 3 row(s)
原因分析:这是因为在HIVE中新建表后会自动从HIVE库默认的HDFS文件路径(/user/hive/warehouse/db_name.db/table_name)下location数据,之前的数据进行load data操作之后会在对应路径(/user/hive/warehouse/db_name.db/table_name)下有数据。