一、hive的内部表

1,建表语句

create table students
(
    id bigint,
    name string,
    age int,
    school string,
    class string
)
#指定分隔符(下面语句表示数据以逗号分隔开)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','   
#手动指定该内部表表格创建在HDFS下的/user/hive/warehouse目录内,也可以不指定,默认存放/user/hive/warehouse下
LOCATION '/user/hive/warehouse';

2,存储位置

内部表数据存储的位置是hive在hdfs中存在默认的存储路径,即default数据库(默认:/user/hive/warehouse)

3,管理主体

内部表的数据是Hive自身管理,创建内部表时,会将数据移动到数据仓库指向的路径

4,内部表转换为外部表

alter table table_name set tblproperties('EXTERNAL'='TRUE');
可以通过 desc formatted 表名  来查看表的属性

5,数据删除问题

删除内部表会直接删除元数据(metadata)及存储数据,对内部表的修改会将修改直接同步给元数据

二、hive的外部表

1,建表语句

# 关键词external 表示创建的hive表为外部表
create external table students
(
    id bigint,
    name string,
    age int,
    school string,
    class string
)
#指定分隔符(下面语句表示数据以逗号分隔开)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','   
#手动指定该内部表表格创建在HDFS下的/user/hive/warehouse_external 目录内
LOCATION '/user/hive/warehouse_external ';

2,存储位置

外部表数据存储的位置可以自己指定,指定除/user/hive/warehouse以外的路径。

3,管理主体

外部表数据由HDFS管理,创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。

4,外部表转换为内部表

alter table table_name set tblproperties('EXTERNAL'='FALSE');
可以通过 desc formatted 表名  来查看表的属性

5,数据删除问题

删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name)

三、hive内部表与外部表的不同使用场景

1,场景一

因为hive内部表在删除表是同时删除表数据与元数据,而外部表删除的时候,仅仅会删除元数据,HDFS上的文件并不会被删除,所以外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

2,场景二

如果所有的数据都由hive处理,则创建内部表;如果数据的处理由hive和其他工具一起处理,则创建外部表。

3,场景三

我们在管理表不方便和其他工作共享数据。可以创建一个外部表指向这份数据,而并不需要对其具有所有权。

我们在使用hive内部表与外部表的时候,需要根据合适的业务场景去选择哦!

我是晓之以理的喵~,欢迎大家相互交流!!!