Hive踩坑——Hive外部表挂载数据以及数据删除注意事项

文章目录

    • 思考:为什么不使用load data?
    • 数据准备
    • 挂载数据
    • 清空数据
    • 总结
    • 补充说明

思考:为什么不使用load data?

如果源数据存在于HDFS层,使用load data,相当于将源数据移动到了hive表的默认路径下(/user/hive/warehouse),与挂载不同。

数据准备

建表语句

--不含分区的外部表
CREATE  external TABLE IF NOT EXISTS `test_01`(
 name STRING,age INT,score INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

--含分区的外部表
CREATE  external TABLE IF NOT EXISTS `test_02`(
 name STRING,age INT,score INT)
PARTITIONED BY (`stat_date` STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

准备三份数据,具体如下,其中c.txt为空文件。

[root@nd2 test]# hadoop fs -cat /user/wh/test/a.txt
lucy,20,100
jack,21,90
Rose,22,90
[root@nd2 test]# hadoop fs -cat /user/wh/test/b.txt
Tom,16,100
[root@nd2 test]# hadoop fs -cat /user/wh/test/c.txt
[root@nd2 test]# 

挂载数据

不含分区的外部表

--指向某一个文件
alter table test_01 set location '/user/wh/test/a.txt';
hive> select * from test_01;
OK
lucy	20	100
jack	21	90
Rose	22	90

--指向文件夹
alter table test_01 set location '/user/wh/test';
hive> select * from test_01;
OK
lucy	20	100
jack	21	90
Rose	22	90
Tom		16	100

含分区的外部表
注意:这里只能指向文件夹,如果指向文件,直接报错

alter table test_02 add if not exists partition (stat_date='20190101') 
location '/user/wh/test/a.txt';
FAILED: Execution Error, return code 1 
from org.apache.hadoop.hive.ql.exec.DDLTask.
MetaException(message:java.io.IOException:
hdfs:/user/wh/test/a.txt is not a directory or unable to create one)

--指向文件夹
alter table test_02 add if not exists partition (stat_date='20190101') 
location '/user/wh/test/';

hive> select * from test_02;
OK
lucy	20	100	20190101
jack	21	90	20190101
Rose	22	90	20190101
Tom		16	100	20190101

清空数据

在Hive的外部表中不能truncate table,否则会直接报错。

hive> truncate table test_01;
FAILED: SemanticException [Error 10146]: 
Cannot truncate non-managed table test_01.

不含分区的外部表

--这里我们可以将location指向一个空文件
alter table test_01 set location '/user/wh/test/c.txt';
hive> select * from test_01;
OK
Time taken: 0.079 seconds

含分区的外部表

--直接删除指定分区即可
alter table test_02 drop if exists partition (stat_date='20190101');
hive> select * from test_02;
OK
Time taken: 0.107 seconds

总结

  • 不能使用truncate table table_name清空外部表,会直接报错。
  • 对于一个不含分区的外部表,挂载数据既可以指定文件,也可以指定文件夹。
  • 对于一个含分区的外部表,挂载数据指定的location是文件夹,而不是文件,否则会报错。

补充说明

Hive在实际的生产环境中为什么建议使用外部表?

  • 外部表不会加载数据到Hive的默认仓库(挂载数据),减少了数据的传输,同时还能和其它外部表共享数据。
  • 使用外部表,Hive不会修改源数据,不用担心数据损坏或丢失。
  • Hive在删除外部表时,删除的只是表结构,而不会删除数据。

你可能感兴趣的:(Hive)