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;

《Flink原理深入与编程实战》