前言

本文为接上文Hive使用(一),本文主要写表的管理

创建内部表

从上文可知,表有两种,外部表和内部表,一般表的创建都是创建内部表

内部表的创建有三种方法

一.自己通过建表语法直接创建

hive (test)> create table if not exists student(
> id int, name string
> )
> row format delimited fields terminated by '\t'
> stored as textfile
> location '/user/hive/warehouse/student';

我们在创建这张表时,

指定了数据的切分的格式为\t 切分

同时指定了存储文件类型为文本类型,

还指定了表存放在HDFS的位置/user/hive/warehouse/student,我们可以通过web端查看表存放的位置

表中还没有数据,所以是一个空的文件夹

这是第一种建表方法

二.根据查询结果创建表(查询的结果会添加到新创建的表中)

第二种方法需要有查询结果,所以我们在使用第二种方法时,需要保证被查的表中有数据

还是test.student这张表,我们先放一些数据进去

这时我们之前的test.student这张表中已经存在了一些数据了

这时我们可以这样创建student2这张表

create table if not exists student2 as select id, name from student;

使用这张方法,Hive里会运行Hive底层封装的MapReduce代码

现在我们来查看一下这张新建的student2这张表

可以看到student2这张表已经建好了,同时之前的student表中的数据也一起添加进student2这张表中了.

我们可以看下这张表的详细信息

hive (test)> desc formatted student2;

看到这里的

Table Type:         	MANAGED_TABLE  

从这里就能看出这是一张内部表

三.根据已经存在的表结构创建表

第三种方法与第二种相似

hive (test)> create table if not exists student3 like student;

使用like关键字,创建的表会创建与原表相似的表结构,但是不会有原表的数据

我们可以查看一下

student3这张表中只有与student这张表相同的表结构并没有student中的数据.

创建外部表

因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

这里我们看一个例子

创建部门和员工外部表,并向表中导入数据

hive (test)> create external table if not exists dept(
> deptno int,
> dname string,
> loc int
> )
> row format delimited fields terminated by '\t';

hive (test)> 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';

现在建好了两张外部表,进行导入数据

hive (test)> load data local inpath '/usr/local/src/datas/dept.txt' into table dept;
hive (test)> load data local inpath '/usr/local/src/datas/emp.txt' into table emp;

查询一下

我们查看一下表的具体信息

Table Type:         	EXTERNAL_TABLE 

代表它是外部表

另一张就不看了,也是外部表

管理表与外部表的互相转换

hive (test)> desc formatted student2;

通过命令进行内外部表转换

hive (test)> alter table student2 set tblproperties('EXTERNAL'='TRUE');

转换完,我们看下

修改外部表为内部表

hive (test)> alter table student2 set tblproperties('EXTERNAL'='FALSE');

这就是转换回来了

注意:(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法,区分大小写!

如果是外部表在Hive里删除了,数据还在HDFS上,只是Hive上记录元数据信息会被删除掉.

HDFS上的数据还在,但是Hive上的表已经没了

本文到这里就结束了,请大家等待下次的更新,感谢大家的阅读.