HiveQL:数据定义,数据库和表

HiveQL 是 Hive 查询语言,与 MySQL 最为接近。Hive 不支持行级插入、更新操作和删除操作,也不支持事务。

数据库操作

Hive 数据库的本质是一个目录或者命名空间。如果没有显示指定数据库,默认使用 default。

创建和删除数据库

如果数据库已经存在,会抛出异常,为了避免抛出异常可以添加“if not exists”语句

> CREATE DATABASE financials;
> CREATE DATABASE IF NOT EXISTS human_resources;

删除数据库同样
默认不能删除有表的数据库,需要先将表删除,或者添加 CASCADE 命令

> DELETE DATABASE financials;
> DELETE DATABASE IF NOT EXISTS human_resources;

> DELETE DATABASE financials CASCADE;

查看和使用数据库

可以使用正则匹配数据库名查询

> SHOW DATABASES;
default
financials
...

> SHOW DATABASES LIKE 'h.*'
human_resources
...

Hive 会为每一个数据库创建一个目录(default 数据库没有此目录),数据库中的表会以子目录的形式存储。Hive 数据存储的根目录由 hive.metastore.warehouse.dir 决定,默认为 /user/hive/warehouse,那么 financials 数据库的存储目录为 /user/hive/warehouse/financials.db

数据库的存储目录可以再创建时指定 LOCATION 进行更改,DESCRIBE 命令可以查看数据库信息

> CREATE DATABASE financials
> LOCATION '/directory';

> DESCRIBE DATABASE financials;
    hdfs://master/directory/financials.db

如果要选择一个数据库作为当前数据库进行操作,使用 USE 命令进行切换

> USE financials;

表操作

创建表

基本的创建表操作符合 SQL 通用语法 CREATE TABLE,但是 Hive 中提供了更多的功能扩展:
可以定义数据存储位置、存储格式、自定义分隔符等

> CREATE TABLE IF NOT EXISTS mydb.employees (
>    name STRING COMMENT 'Employee name',
>    salary FLOAT COMMENT 'Employee salary',
>    subordinates ARRAY<STRING> COMMENT 'Names of subordinates',
>    deductions MAP<STRING, FLOAT> COMMENT 'Deductions name and percentage',
>    address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
>            COMMENT 'Home address',
> )
> COMMENT 'Employee infomation'
> TBLPROPERTIES('creator'='alex','created_time'='2020-01-01'...)
> LOCATION '/user/hive/warehouse/mydb.db/employees';
  1. 如果当前数据库不是要操作的数据库,可以再表前添加数据库名作为前缀,如 “mydb.”
  2. 防止表已经存在抛出异常,可添加“IF NOT EXISTS”
  3. TBLPROPERTIES 是表的数据,默认会有两个属性 last_modified_by 和 last_modified_time
  4. 如果要拷贝一个表的 Schema 来新创建一个表,不拷贝数据,可以使用“LIKE”命令
> CREATE TABLE IF NOT EXISTS employees2
> LIKE mydb.employees;

查看当前数据库下的表
使用 SHOW TABLES 命令查看

> USE mydb;
> SHOW TABLES;
emplyees
...

// 不在指定数据库下
> SHOW TABLES IN mydb;
emplyees
...

// 名称匹配
> SHOW TABLES LIKE 'empl.*';
emplyees
...

查看指定表定义,可以使用 DESCRIBE 命令,EXTENDED 替换为 FORMATED 可以输出更多的信息

> DESCRIBE EXTENDED employees;

> DESCRIBE FORMATED employees;

内部表和外部表

目前创建的表都是内部表,数据的声明周期由 Hive 控制(不完全),输入删除表,表对应的存储数据也会删除。Hive 还可以创建外部表,外部表的数据不由 Hive 控制。外部表以及表分区查看 Hive 数据模型

修改表

删除表使用 DROP 命令
对于内部表,会删除元数据和存储数据;对于外部表,只删除元数据信息

> DROP TABLE IF EXISTS employees;

修改表的原数据使用 ALTER 命令

// 重命名
> ALTER TABLE log_message RENAME TO logmsgs;

// 修改分区
> ALTER TABLE log_message ADD IF NOT EXISTS
> PARATITION(year=2020, month=1, day=1) LOCATION '/logs/2020/1/1'
> PARATITION(year=2020, month=2, day=1) LOCATION '/logs/2020/3/1'
> PARATITION(year=2020, month=3, day=1) LOCATION '/logs/2020/2/1';

// 删除分区
> ALTER TABLE log_message DROP IF EXISTS PARATITION(year=2020, month=1, day=1);

// 修改列
// 1. 修改列名、类型
// 2. 添加 COMMENT
// 3. 改变列的位置
> ALTER TABLE log_message
> CHANGE COLUMN hms hours_minutes_seconds INT
> COMMENT 'The hours, minutes and seconds of part of the timestamp'
> AFTER severity;

// 增加列
> ALTER TABLE log_message ADD COLUMNS (
>    app_name STRING COMMENT 'Application name',
>    session_id LONG COMMENT 'Current session id'
> );

// 修改表属性
> ALTER TABLE log_message SET TBLPROPERTIES (
>    'notes'='xxxxxxx'
> );

// 修改存储属性
// 1. 修改存储格式
> ALTER TABLE log_message
> PARATITION(year=2020, month=1, day=1)
> SET FILEFORMAT SEQUENCEFILE;

Hive 表保护

可以防止分区被删除或查询

> ALTER TABLE log_message
> PARATITION(year=2020, month=1, day=1) ENABLE NO_DROP;

> ALTER TABLE log_message
> PARATITION(year=2020, month=1, day=1) ENABLE OFFLINE;

References:
《Hive 编程指南》

Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

17 − 7 =