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]