4.4 内部表和外部表
Hive 的表在逻辑上有两部分组成:
存储的数据. 真实的存储的数据在 Hive 中都是以文件的形式存在, 这个其他的普通的关系型数据库有差别. Hive 的数据一般存储在 HDFS 中
表示表中数据的元数据. Hive 把元数据存储在通常的数据库中. 比如默认情况我们所有表的元数据都是存储在 derby 数据库中. 也可以不用 derby, 整合成大家都比较熟悉的 MySql 数据库.
4.4.1 内部表
Hive 的数据存储在 HDFS 系统中, 如果创建表的时候, Hive 把数据迁移到数据仓库中(/user/hive/warehouse)中, 这种表我们把它称为
Hive 默认情况创的表都是内部表.
当向内部表加载数据(load)的时候, 数据会迁移到数据仓库中(这里指的是从 HDFS 加载数据才会迁移, 从本地文件不会).
当删除表(drop)的时候, 表的元数据和实际存储的数据都会被删除. 所以数据彻底会消失.
4.4.2 外部表
创建表的时候加入关键字external, 这样创建的表就是外部表.
事实上, 在创建外部表的时候, Hive 甚至就不检查这个数据是否存在. 这是一个非常有用的特性,因为这意味着你可以把创建数据推迟到创建表之后.
删除外部表的时候, Hive 只会删除表的元数据,并不会删除数据.
4.4.3 实操
分别创建部门和员工外部表,并向表中导入数据。
dept.txt
10 ACCOUNTING 1700
20 RESEARCH 1800
30 SALES 1900
40 OPERATIONS 1700
emp.txt
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
创建部门表:
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
创建员工表:
create external table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';

向表中导入数据:
load data local inpath '/opt/module/datas/dept.txt' into table default.dept;
load data local inpath '/opt/module/datas/emp.txt' into table default.emp;

查看表格式化数据:
desc formatted dept;

4.4.4 内部表和外部表的互换
把
dept.txt变成内部表(管理表)alter table dept set tblproperties('EXTERNAL'='FALSE');
把
stu变成外部表alter table stu set tblproperties('EXTERNAL'='TRUE');
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!