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;