表分类
在Hive中,表类型主要分为两种,
第一种:内部表
- 也叫管理表
- 表目录会创建在集群上的
{hive.metastore.warehouse.dir}
下的相应的库对应的目录中。 - 默认创建的表就是内部表
第二种:外部表
- 外部表需要使用关键字"
external
", - 外部表会根据创建表时
LOCATION
指定的路径来创建目录, - 如果没有指定
LOCATION
,则位置跟内部表相同,一般使用的是第三方提供的或者公用的数据。 - 建表语法:必须指定关键字
external
。
create external table tableName(id int,name string) [location 'path'];
内部表和外部表转换:
内部表转外部表
alter table tableName set tblproperties('EXTERNAL'='TRUE');
--注意:内部表转外部表,true一定要大写;
外部表转内部表
alter table tableName set tblproperties('EXTERNAL'='false');
--说明:false不区分大小
两者之间区别
1) 内部表和外部表在创建时的差别
就差两个关键字,EXTERNAL
和 LOCATION
举例:
- 内部表 --
- CRAATE TABLE T_INNER(ID INT);
- 外部表 --
- CREATE EXTERNAL TABLE T_OUTER(ID INT) LOCATION 'HDFS:///AA/BB/XX';
2) Hive表创建时要做的两件事:
-
在
hdfs
下创建表目录 -
在元数据库
mysql
创建相应表的描述数据(元数据)
3) drop时有不同的特性:
1、drop
时,元数据都会被清除
2、drop
时,内部表的表目录会被删除,但是外部表的表目录不会被删除。
4) 使用场景
内部表: 平时用来测试
或者少量数据,并且自己可以随时修改删除数据.
外部表:使用后数据不想被删除
的情况使用外部表(推荐使用)所以,整个数据仓库的最底层的表使用外部表
案例
创建内部表
create table innerdemo
(
empno int,
ename string,
job string,
mgr int,
hiredate date,
sal double,
comm double,
deptno int
)
row format delimited
fields terminated by ','
stored as textfile;
创建后在hdfs
上的存储位置如下,因为没有指定存储位置,所以默认存储位置就是在如下地方
/user/hive/warehouse/innerdemo
接下来删除内部表测试
drop table innerdemo;
去hdfs上查看,可以看到原文件已被删除.
创建外部表
create external table externaldemo
(
empno int,
ename string,
job string,
mgr int,
hiredate date,
sal double,
comm double,
deptno int
)
row format delimited
fields terminated by ','
stored as textfile
location 'hdfs:///hiveout';
insert into table externaldemo select * from emp;
此时在hdfs上的位置如下,文件名还是0000 这个是惯例
接下来删除外部表测试
drop table externaldemo;
去hdfs
上就会发现文件还是存在的!并不会真的删除文件
总结
- 内部表可以用于测试
- 外部表比较安全,删除的时候不会真的删除,只是删除
mysql
里面的元信息
,而不会删除真正的数据文件