一、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内部表与外部表的时候,需要根据合适的业务场景去选择哦!
我是晓之以理的喵~,欢迎大家相互交流!!!