HIVE踩坑——使用load data导入数据到外部表和内部表的区别

准备测试表两张,相关建表语句如下
其中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)下有数据。

总结

  • 不指明类型的情况下,HIVE会默认新建的表为内部表,外部表需要使用external关键字。
  • 在HIVE中使用外部表的时候要格外注意,当我们删除外部表时,删除的只是元数据,存储数据仍被保留。当我们删除内部表时,元数据和存储数据都被删除。
  • 相对于内部表而言,外部表使用更加安全(只会删除元数据),更加方便数据共享。
  • 使用load data操作的时候,不管是外部表还是内部表,如果源数据存在于HDFS层,都是数据的移动。即源数据从HDFS存储路径移动到HIVE数据仓库默认路径。

你可能感兴趣的:(Hive)