Hive DDL操作
Hive的DDL操作包括数据库创建、修改和删除操作;数据表创建、修改和删除操作。
创建和删除Hive数据库
Hive的数据模型与关系型数据库非常类似,由表模式、列、行和分区组成。这些对象是在Hive Metastore中定义的逻辑单位。
一个Hive schema或数据库本质上是一个命名空间(在Hive中schema和数据库是同义词),存有一系列表的元数据信息。
当第一次安装Hive时,会创建一个default默认数据库(它没有自己的目录)。
创建数据库的语法如下:
CREATE [REMOTE] (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [MANAGEDLOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value, ...)];
删除数据库的语法:
drop (database | schema) [if exists] database_name [restrict | cascade];
修改数据库的语法:
alter (database | schema) database_name set dbproperties (属性名=属性值, ...);
例如,修改数据Hive_learning的属性:
alter database Hive_learning set dbproperties ('Created by' = 'User1', 'Created on'= '15-Jan-2015');
描述数据库Hive_learning:
describe database Hive_learning; describe schema Hive_learning; describe database extended Hive_learning;
创建和删除Hive数据表
Hive表用来定义结构(schema)和其它元数据信息,如存储在HDFS中的数据集的位置和存储格式。通过这些表定义可以使用Hive查询语言来进行数据处理和分析。
创建Hive表的完整语法如下:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...)
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];
参数说明:
- Hive的表名和列名是不区分大小写的。
- ROW FORMAT DELIMITED: 命令hive使用本地SerDe(序列化和反序列化类,Hive用它来序列化和反序列化数据)与分隔的字段。
- 在原始数据文件中,使用的分隔符是';' - 这使用'\73'来指定,因为;在hive中是保留字符。
- stored as textfile:告诉hive,数据文件是文本文件。
创建表时,或者修改表时,可以使用tblproperties短语来指定一些表级属性。 Hive带有一些预定义的基本属性,可定义一些表级配置,Hive用来管理表。 也可以定义一些自定义属性,使用key-value格式,来存储一些表级元数据或添加额外的表信息。
Hive中一些重要的表级属性有:
- last_modified_user
- last_modified_time
- immutable
- orc.compress
- skip.header.line.count (用于外部表)
可以使用alter table命令修改已经存在的表结构:
重命名表:
alter table 原表名 rename to 新表名;
添加新列:
alter table transactions add columns(loyalty_card boolean);
要修改表的属性,使用alter table命令。修改表属性的语法如下:
ALTER TABLE table_name SET TBLPROPERTIES table_properties;
Alter Table Hive_Test_table SET TBLPROPERTIES ('comment' = 'This is a new comment');
删除指定的表,使用drop table命令:删除表的语法如下:
DROP TABLE [IF EXISTS] table_name [PURGE];
truncate表
使用truncate table命令,删除表中所有的行,但保留表结构。在Hive中truncat一张表是间接从HDFS中移除该文件。
truncate表的语法如下:
TRUNCATE TABLE table_name [PARTITION partition_spec];
其中partition_spec代表分区表的分区规范,语法如下:
(partition_column = partition_col_value, partition_column = partition_col_value, ...)
例如,要截断一表books,使用如下的Hive语句:
truncate table books;
Hive DDL操作示例
下面演示了如何实际创建Hive数据库和表的Hive QL语句。可以在Hive CLI中或任何Hive支持的客户端工具中执行。确保已经启动了Hadoop集群。
-- 查看当前有哪些数据库:
show databases;
-- 创建数据库xueai8
create database xueai8;
-- 切换到(打开)数据库xueai8;
use xueai8;
-- 查看当前数据库中有哪些数据表:
show tables;
-- 创建数据表test_tb:
create test_td(
test_id int,
test_content string
);
-- 再一次查看当前有哪些数据表:
show tables;
-- 查看表结构
desc test_tb;
desc formatted test_tb;
-- 删除数据表test_tb:
drop table test_tb;
-- 再一次查看当前有哪些数据表:
show tables;
-- 删除数据库xueai8:
drop database xueai8;
-- 再一次查看当前有哪些数据库:
show databases;