在hive创建表的语法中有一个关键字是EXTERNAL,该关键字表示表的类型,在hive中一共有两种类型的表:管理表和托管表(外部表)。如果没有加EXTERNAL关键字,则创建表都是管理表。
1.管理表信息
如何查看一张表是管理表还是托管表呢?可以使用desc命令:
(default
其他的信息暂且不看,其中有一行信息是Table Type: MANAGED_TABLE,这个就是指示表的类型的,可以看出这张表是管理表。
2.外部表
下面我们创建一张外部表,创建外部表只需在原有的建表语句上增加EXTERNAL关键字。
(default
可以看到外部表emp_ext已经创建成功了,我们看一下该表的详细描述信息:
(default
可以看到该表的表类型描述为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,后面如果不需要使用该表的时候可以删除该表,但是不会删除数据。而管理表在删除表的时候会将数据一起进行删除。
管理表与外部表的区别如下:
4.创建外部表
我们通过指定hdfs路径的方式创建外部表,然后不通过load的方式加载数据。
(default
location中指定的目录不存在也没有关系,但是上级目录一定要有访问权限,否则会报错。下面创建目录并将数据放入目录中:
(default
然后我们查询一下该表:
(default
可以看到数据已经加载进来,但是我们并没有进行load数据,所以对于外部表只要将数据文件放到对应的目录下,该外部表就可以正常访问,这也是企业中常用的做法。