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')为固定写法,区分大小写!