在hive创建表的语法中有一个关键字是EXTERNAL,该关键字表示表的类型,在hive中一共有两种类型的表:管理表和托管表(外部表)。如果没有加EXTERNAL关键字,则创建表都是管理表。
1.管理表信息
如何查看一张表是管理表还是托管表呢?可以使用desc命令:
hive (default)> desc formatted dept;
OK
col_name data_type comment
# col_name data_type comment
deptno int
dname string
loc string
# Detailed Table Information
Database: default
Owner: hive
CreateTime: Wed Feb 13 21:06:45 CST 2019
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://node1:8020/user/hive/warehouse/dept
Table Type: MANAGED_TABLE
Table Parameters:
COLUMN_STATS_ACCURATE true
numFiles 1
totalSize 82
transient_lastDdlTime 1550063999
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim \t
serialization.format \t
Time taken: 0.454 seconds, Fetched: 32 row(s)
其他的信息暂且不看,其中有一行信息是Table Type: MANAGED_TABLE,这个就是指示表的类型的,可以看出这张表是管理表。
2.外部表
下面我们创建一张外部表,创建外部表只需在原有的建表语句上增加EXTERNAL关键字。
hive (default)> create EXTERNAL table IF NOT EXISTS default.emp_ext(
> empno int,
> ename string,
> job string,
> mgr int,
> hiredate string,
> sal double,
> comm double,
> deptno int
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> ;
OK
Time taken: 0.208 seconds
hive (default)> show tables;
OK
tab_name
dept
dept_cats
emp
emp_ext
Time taken: 0.073 seconds, Fetched: 4 row(s)
可以看到外部表emp_ext已经创建成功了,我们看一下该表的详细描述信息:
hive (default)> desc formatted emp_ext;
OK
col_name data_type comment
# col_name data_type comment
empno int
ename string
job string
mgr int
hiredate string
sal double
comm double
deptno int
# Detailed Table Information
Database: default
Owner: hive
CreateTime: Wed Feb 13 21:54:25 CST 2019
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://node1:8020/user/hive/warehouse/emp_ext
Table Type: EXTERNAL_TABLE
Table Parameters:
EXTERNAL TRUE
transient_lastDdlTime 1550066065
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
field.delim \t
serialization.format \t
Time taken: 0.076 seconds, Fetched: 35 row(s)
可以看到该表的表类型描述为Table Type: EXTERNAL_TABLE,表明该表是一张外部表。
3.管理表与外部表的区别
那么外部表和管理表最大的区别在哪呢?对于大公司网站的日志,一般会有专门的部门来进行日志处理,处理完后会将日志保存到hdfs中,比如保存的路径如下:
/hdfs/sitelog
20190212.txt
20190213.txt
20190214.txt
现在有两个业务部门:数据挖掘和机器学习,他们都需要对这个日志进行分析,如果以管理表的方式存储在hive中,那么hdfs上的文件路径会如下:
/user/dept1/hive
20190212.txt
20190213.txt
20190214.txt
/user/dept2/hive
20190212.txt
20190213.txt
20190214.txt
这样本来在hdfs上每个文件保存有三份,如果使用管理表,那么每个文件将会保存9份,对存储空间造成极大的浪费。这个时候就需要使用外部表的特性,外部表在创建表的时候可以指定数据文件的路径,比如/hdfs/sitelog,后面如果不需要使用该表的时候可以删除该表,但是不会删除数据。而管理表在删除表的时候会将数据一起进行删除。
管理表与外部表的区别如下:
对比项 | 管理表 | 外部表 |
---|---|---|
表类型 | MANAGED_TABLE | EXTERNAL_TABLE |
存储位置 | 默认存储在/user/hive/warehouse下,也可以通过location指定 | 在创建表的时候可以自己指定目录位置 |
删除表 | 删除表的时候会删除表数据以及元数据 | 删除表时只会删除元数据而不会删除表数据 |
4.创建外部表
我们通过指定hdfs路径的方式创建外部表,然后不通过load的方式加载数据。
hive (default)> create EXTERNAL table IF NOT EXISTS default.emp_ext2(
> empno int,
> ename string,
> job string,
> mgr int,
> hiredate string,
> sal double,
> comm double,
> deptno int
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> location '/user/hive/user1/warehouse/emp_ext2';
OK
Time taken: 0.428 seconds
location中指定的目录不存在也没有关系,但是上级目录一定要有访问权限,否则会报错。下面创建目录并将数据放入目录中:
hive (default)> dfs -mkdir -p /user/hive/user1/warehouse/emp_ext2;
hive (default)> dfs -put /opt/datas/emp.txt /user/hive/user1/warehouse/emp_ext2;
hive (default)> dfs -ls /user/hive/user1/warehouse/emp_ext2;
Found 1 items
-rw-r--r-- 3 hive hive 659 2019-02-13 23:12 /user/hive/user1/warehouse/emp_ext2/emp.txt
然后我们查询一下该表:
hive (default)> select * from emp_ext2;
OK
empno ename job mgr hiredate sal comm deptno
7369 SMITH CLERK 7902 1980-12-17 800.0 NULL 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.0 300.0 30
7521 WARD SALESMAN 7698 1981-2-22 1250.0 500.0 30
7566 JONES MANAGER 7839 1981-4-2 2975.0 NULL 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.0 1400.0 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.0 NULL 30
7782 CLARK MANAGER 7839 1981-6-9 2450.0 NULL 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.0 NULL 20
7839 KING PRESIDENT NULL 1981-11-17 5000.0 NULL 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.0 0.0 30
7876 ADAMS CLERK 7788 1987-5-23 1100.0 NULL 20
7900 JAMES CLERK 7698 1981-12-3 950.0 NULL 30
7902 FORD ANALYST 7566 1981-12-3 3000.0 NULL 20
7934 MILLER CLERK 7782 1982-1-23 1300.0 NULL 10
Time taken: 0.96 seconds, Fetched: 14 row(s)
可以看到数据已经加载进来,但是我们并没有进行load数据,所以对于外部表只要将数据文件放到对应的目录下,该外部表就可以正常访问,这也是企业中常用的做法。
更多有关大数据的内容请关注微信公众号:大数据与人工智能初学者
扫描下面的二维码即可关注: