Hive之表操作

本文最后更新于:2 年前

创建表

通过 create table 创建表,建表语句遵循SQL语法:

1
2
3
4
5
6
7
create table [if not exists]
数据库名.表名(
字段1 字段类型,
字段2 字段类型,
...
)
[row format delimited fields terminated by '字段分隔符'];

以上命令中,可以通过数据库名.表名的方式来指定表所在的数据库。

用户可以增加可选项 if not exists ,即使表已经存在,也会忽略后面的执行语句而不会有异常信息。这种方式一般常用与第一个执行时需要创建表的脚本中。后面的 row format delimited fields terminated by '字段分隔符' 是可选的,用于指定数据文件中字段的分隔符的。

用户可以拷贝一张已经存在的表:

1
hive> create table if not exists testdb.teacher like testdb.student1;

只会复制表的结构,不会拷贝数据。

查看表

查看正在使用的数据库中的所有表:

1
hive> show tables;

即使用户不位于目标数据库下,也可以通过 in 来查看指定数据库下的表:

1
hive> show tables in 数据库名;

可以通过desc查看表的结构信息:

1
hive> desc 表名;

内部表(管理表)与 外部表

之前创建的表都是内部表:即先在 hive 中创建一个表,然后向这个表中插入数据(insert、外部文件导入),这样的表称之为内部表。

对于内部表,Hive 控制数据的生命周期,Hive 默认情况下会将这些数据存在HDFS的 /hive/warehouse
目录下,当我们删除一个内部表时,Hive 也会删除表中数据。


假设 HDFS 上已经有数据了,此时我们通过 hive 创建一张表来管理这个文件数据,此时,这个表被称为外部表

在 Linux 本地创建一个 txt 文件:

1
2
3
4
1 Tom
2 Jerry
3 Spike
4 Mike

将此文件上传到 HDFS 的 /hivetest 目录下:

1
[root@gaojie test]# hdfs dfs -put stu.txt /hivetest/stu.txt

创建外部表:

1
2
hive> create external table stu(id int,name string) row format delimited fields
terminated by ' ' location '/hivetest';

对于外部表,Hive并不完全拥有这份数据,因此,如果在Hive中删除了对应的外部表,并不会删除数据,不过表的元数据信息会被删除掉。


内部表和外部表的区别

  1. 建表命令

    • 内部表:create table ...

    • 外部表:create external table ... location '文件所在的路径'

  2. 删除表

    对于内部表,删除时会把表的元数据和数据一并删除;

    对于外部表,删除时会删除元数据,但是不删除源数据。

修改表

重命名

1
hive> alter table student1 rename to student3;

为表新增字段

1
hive> alter table student3 add columns(age int);

更改字段

更改字段名、数据类型、位置

1
hive> alter table student3 change age hobby string;

以上语句作用为:将 student 表的 age 字段改为 hobby ,类型改为string。

可以通过 after 字段名 将当前字段移动到指定字段后面。注意,移动完之后,数据是不会移动的,一般是用在空表或者表中的数据要刷新:

1
hive> alter table student3 change hobby hobby string after id;

删除/替换字段

1
hive> alter table student3 replace columns(hobby string);

replace 会将原来表的列都删除掉,然后添加新的列。上面的语句代表的是:将 id、name、hobby 都删除,然后添加 hobby 字段。

删除/清空表


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!