Hive的库表操作

清泓
2022-06-01 / 0 评论 / 894 阅读 / 4736字 / 正在检测是否收录...

Hive的库表操作

  hive是类sql的,所以对库表的操作也和sql相似。这里总结一下Hive的DDL数据定义,因为查询语句篇幅太长,就另起一篇记录

Hive操作数据库

创建数据库

  首先,hive是将HDFS中结构化的数据文件映射成一张数据库表,并提供类SQL的功能。所以,可以将创建数据库理解为是创建一个大文件夹,而创建表则是创建一个存储结构数据的小文件夹

1.创建一个数据库,数据库在HDFS 上的默认存储路径是 /user/hive/warehouse/\*.db

2.避免要创建的数据库已经存在错误,增加 if not exists 判断。(标准写法)

3.创建一个数据库,可以使用 location 指定数据库在 HDFS 上存放的位置

完整的创建数据库指令为:

hive> create database [if not exists] <数据库名> [location <HDFS路径>];

举例:在HDFS的hive目录下创建Test库

hive> create database if not exists Test location '/hive/Test';  //要指定数据库名

查询数据库

Hive数据库查询常用操作指令

1.查看所有数据库

hive> show databases; 

2.查看以db_开头的数据库

hive> show databases like ‘db_*’;

3.查看数据库的描述信息

hive> desc database 数据库名;

4.查看数据库详细的信息

hive> desc database extended 数据库名;

切换数据库

hive> use 数据库名;

修改数据库

给数据库设置属性值,采用键值对标识这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。语法:

hive> alter database <database_name> set dbpropertis ('<property_name>'='<property_value>',..); 

删除数据库

1.删除空数据库可以直接删除

2.删除数据库时,最好采用 if exists 判断数据库是否存在

3.如果数据库不为空,可以采用 cascade 命令,强制删除。在删除数据库的时候会将数据库下面的所有表也进行删除。数据库删除后相应的hdfs上的目录也会被删除。

hive> drop database [if exists] 数据库名;

Hive操作表

创建表

建表语句:

create [external] table [if not exists] 表名

[(字段名 数据类型 [comment 字段注释], ...)]

[comment 表注释]

[partitioned by (字段名 数据类型 [comment 字段注释], ...)]

[clustered by (字段名, 字段名, ...)

[sorted by (字段名 [ASC|DESC], ...)] into num_buckets BUCKETS]

[row format row_format]

[stored as file_format]

[location hdfs_path]

字段解释:
1.create table 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;可以用 if not exists 选项来忽略这个异常

2.external 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(location),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据

3.comment:为表或列添加注释

4.partitioned by 创建分区表

5.clustered by 创建分桶表

6.sorted by 指定排序(不常用)

7.row format delimited
  [fields terminated by char]
  [collection items terminated by char]
  [map keys terminated by char]
  [lines terminated char] | serde serde_name [with serdeproperties (property_name=property_value, property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表的具体的列的数据。SerDe 是 Serialize/Deserilize 的简称,目的是用于序列化和反序列化

8.stored as 指定存储文件类型

9.location指定表在HDFS 上的存储位置。

10.like 复制现有的表结构,但是不复制数据


建表实例

1.直接使用create语句 (if not exists判断是否已存在表,by后面接分隔符)

//创建tbl_test1表,列分隔符为 ,
hive > create table if not exists tbl_test1(key int,value string) row format delimited fields terminated by ',';

2.使用子查询的结果集建表 (表名前可加库名(库名.表名))
create table 表名 as 子查询

hive> create table tbl_test2 as select * from tbl_test1 where id > 1;

3.使用子查询的结果集创建临时表
create temporary table 表名 as select * from 表名2 limit 200;

hive > create temporary table tbl_test3 as select * from tbl_test2 limit 200;

4.创建外部表
create external table 表名 (字段1 数据类型,字段2 数据类型) row format delimined fields terminated by ',';

hive > create external table tbl_test4 (key1 string,key2 string) row format delimined fields terminated by ',';

5.使用子查询的结果集创建创建视图
create view 视图名 as select * from 表名 limit 200;

hive > create view tbl_test5 as select * from tbl_test4 limit 200;

6.根据已经存在的表结构创建表(不导入数据)

hive > create table if not exists tbl_test6 like tbl_test5;

7.创建分区表

hive > create table tbl_test7(key1 int, key2 string) partitioned by (partitionkey string)
row format delimited fields terminated by '\t';

删除表

不作判断直接删除

hive > drop table tb_name;

判断是否存在

hive > drop table if exists tb_name;

修改表

1.重命名表

hive > alter table table_name rename to new_table_name

2.增加列

hive > alter table student add columns (rank string);

3.添加分区

//添加多个分区partition(分区字段='分区值')以空格分隔
hive > alter table table_name add partition(分区字段='分区值') partition(分区字段='分区值'); 

4.删除分区

hive > alter table student drop partition(分区字段='分区值');

5.替换列

hive > alter table table_name replace columns (col_name data_type [comment col_comment], ...)

6.更新列

hive > alter table table_name change [column] col_old_name col_new_name column_type [comment col_comment] [first|after column_name]

1

打赏

评论

博主关闭了当前页面的评论