在 Apache Hive 中,数据库 (Database),有时也被称为模式 (Schema),是组织和管理 表及其他对象的基本命名空间单元。熟练掌握数据库层面的数据定义语言 (DDL) 操作,是构建清晰、有序的 Hive 数据仓库的第一步。本篇笔记将详细梳理 Hive 数据库的各种 DDL 语法及其应用实例。
一、创建数据库 (CREATE DATABASE / SCHEMA)
创建数据库是 最基本的操作,它 为你的数据表提供了一个 逻辑容器。1. 基本创建语法 语法:
sql CREATE DATABASE [IF NOT EXISTS] database_name;
或使用
SCHEMA 关键字 (等效):sql CREATE SCHEMA [IF NOT EXISTS] database_name;
说明:
IF NOT EXISTS:如果尝试创建一个已存在的数据库,加上此子句可以避免抛出错误,命令会静默地不执行任何操作。若不加且数据库已存在,则会报错。
database_name:
你为数据库设定的
唯一名称。命名规则通常
遵循字母、数字和下划线的组合,
不建议使用
特殊字符或 Hive 关键字。
示例:
sql -- 创建一个名为 hr_system 的数据库 CREATE DATABASE hr_system; -- 尝试创建一个名为 sales_data 的数据库,如果它不存在 CREATE DATABASE IF NOT EXISTS sales_data; -- 使用 SCHEMA 关键字创建 CREATE SCHEMA IF NOT EXISTS marketing_campaigns;
2. 创建数据库并添加注释 (COMMENT)
为数据库添加注释是一个 良好的 实践,有助于 理解数据库的 用途。
语法:
sql CREATE DATABASE [IF NOT EXISTS] database_name COMMENT '这是一个描述性的注释';
示例:
sql CREATE DATABASE IF NOT EXISTS finance_department COMMENT '存储所有财务相关数据的数据库';
3. 创建数据库并指定存储位置 (LOCATION)
默认情况下,Hive 会在配置文件 (
hive-site.xml 中的 hive.metastore.warehouse.dir 指定的数据仓库根目录) 下为每个数据库创建一个同名的子目录 (通常是 database_name.db) 来存放该数据库下所有表的数据。你可以通过 LOCATION 子句来覆盖这个默认行为,将数据库的数据文件存储在 HDFS 的特定路径下。
语法:
sql CREATE DATABASE [IF NOT EXISTS] database_name LOCATION 'hdfs_absolute_path';
说明:
hdfs_absolute_path:
必须是 HDFS 上的
一个绝对路径。Hive
不会自动创建这个路径,你需要
确保该路径
已存在或者 Hive
用户有权限在该父目录下
创建子目录。
示例:
sql -- 确保 HDFS 路径 /data/project_alpha/db_storage 存在或可被创建 CREATE DATABASE IF NOT EXISTS project_alpha_db LOCATION '/data/project_alpha/db_storage';
注意: 指定
LOCATION 后,该数据库下
新创建的表 (如果建表时
不指定表级别的
LOCATION) 的
数据会
默认存放在这个
数据库指定的路径下。
4. 创建数据库并设置属性 (WITH DBPROPERTIES)
你可以为数据库关联一些自定义的键值对属性,这些属性存储在 Metastore 中,可以用于记录一些额外的信息。 语法:
sql CREATE DATABASE [IF NOT EXISTS] database_name WITH DBPROPERTIES ( 'property_name1' = 'property_value1', 'property_name2' = 'property_value2', ... );
示例:
sql CREATE DATABASE IF NOT EXISTS gaming_stats WITH DBPROPERTIES ( 'owner' = 'GameDevTeam', 'created_date' = '2023-10-28', 'data_sensitivity' = 'medium' );
5. 组合使用所有子句
当然,你可以 组合使用以上 各种可选子句。
示例:
sql CREATE DATABASE IF NOT EXISTS retail_analytics COMMENT '零售业务分析数据库' LOCATION '/dw/retail_data' WITH DBPROPERTIES ( 'data_source' = 'Multiple POS Systems', 'refresh_frequency' = 'daily' );### *二、查看和描述数据库 创建完数据库后,我们需要 方法来 查看和了解它们的 信息。
1. 列出所有数据库 (SHOW DATABASES / SCHEMAS) 语法:
sql SHOW DATABASES;
或使用
SCHEMAS (等效):sql SHOW SCHEMAS;
作用:
显示当前 Hive Metastore 中
存在的
所有数据库的
列表。
示例:
sql SHOW DATABASES; -- 可能的输出: -- default -- finance_department -- hr_system -- marketing_campaigns -- my_project_db -- project_alpha_db -- retail_analytics -- sales_data -- gaming_stats
2. 过滤数据库列表 (LIKE)
你可以 使用
LIKE 子句和
通配符 (
* 匹配任意字符序列,
| 用于分隔多个模式) 来
过滤显示的
数据库名称。
语法:
sql SHOW DATABASES LIKE 'pattern_with_wildcards';
示例:
sql -- 显示所有以 "sales" 开头的数据库 SHOW DATABASES LIKE 'sales*'; -- 显示名为 "hr_system" 或 "finance_department" 的数据库 SHOW DATABASES LIKE 'hr_system|finance_department';
3. 查看数据库详细信息 (DESCRIBE DATABASE / SCHEMA)
获取某个特定数据库的详细描述。 基本语法:
sql DESCRIBE DATABASE database_name;
或使用
SCHEMA (等效):sql DESCRIBE SCHEMA database_name;
显示更详细信息 (EXTENDED):
使用 EXTENDED 关键字可以
查看数据库的
所有属性 (DBPROPERTIES)。
sql DESCRIBE DATABASE EXTENDED database_name;
示例:
sql DESCRIBE DATABASE retail_analytics; -- 输出可能包含: -- retail_analytics hdfs://namenode_host/dw/retail_data hadoop_user USER 零售业务分析数据库 DESCRIBE DATABASE EXTENDED gaming_stats; -- 输出可能包含: -- gaming_stats hdfs://namenode_host/user/hive/warehouse/gaming_stats.db hive_user USER (owner=GameDevTeam, created_date=2023-10-28, data_sensitivity=medium)*三、切换和使用数据库 在进行表操作之前,通常需要 先指定要 操作的 当前数据库。
1. 切换当前数据库 (USE) 语法:
sql USE database_name;
作用: 将当前 Hive 会话的默认数据库设置为
database_name。之后所有不显式指定数据库的表操作 (如 CREATE TABLE my_table ...) 都会在该数据库下执行。
示例:
sql USE retail_analytics; -- 后续的 SHOW TABLES; CREATE TABLE some_table ...; 等命令都将在 retail_analytics 数据库上下文中执行
2. 查看当前数据库 (CURRENT_DATABASE())
如果你不确定当前工作在哪个数据库下,可以使用这个内置函数。 语法:
sql SELECT current_database();
示例:
sql SELECT current_database(); -- 输出可能为: retail_analytics (如果之前执行了 USE retail_analytics;)*四、修改数据库属性 (ALTER DATABASE / SCHEMA) 一旦数据库创建完成,你 仍然可以修改它的 一些属性,最 常用的是 修改
DBPROPERTIES。
注意: 直接修改数据库的
LOCATION 或
COMMENT 通常
不被直接支持或
操作复杂/有风险,这些
属性一般在
创建时就
确定好。
1. 修改数据库属性 (SET DBPROPERTIES) 语法:
sql ALTER DATABASE database_name SET DBPROPERTIES ( 'property_name1' = 'new_value1', 'property_name2' = 'new_value2', ... );
或使用
SCHEMA (等效):sql ALTER SCHEMA database_name SET DBPROPERTIES (...);
作用:
添加新的数据库属性,或者
更新已有属性的
值。
示例:
sql -- 为 gaming_stats 数据库更新 owner 并添加一个新属性 last_reviewed_by ALTER DATABASE gaming_stats SET DBPROPERTIES ( 'owner' = 'UpdatedGameTeamLead', 'last_reviewed_by' = 'DataQualityTeam' ); -- 查看修改后的属性 DESCRIBE DATABASE EXTENDED gaming_stats;*五、删除数据库 (DROP DATABASE / SCHEMA) 删除数据库是一个 需要非常谨慎的操作,因为它 可能导致 大量数据和元数据的 丢失。
1. 基本删除语法 语法:
sql DROP DATABASE [IF EXISTS] database_name;
或使用
SCHEMA (等效):sql DROP SCHEMA [IF EXISTS] database_name;
默认行为 (RESTRICT): 如果
不加任何额外选项,
DROP DATABASE 默认
采用 RESTRICT 行为。这意味着如果
数据库中包含任何表,删除操作会
失败并报错,以
防止意外删除有内容的数据库。
示例 (尝试删除一个可能非空的数据库):
sql -- 假设 temp_db 中有表,以下命令会失败 DROP DATABASE IF EXISTS temp_db; -- ERROR: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database temp_db is not empty. One or more tables exist.
2. 强制删除数据库及其内容 (CASCADE)
如果你确定要 删除数据库以及 其中包含的 所有表和数据 (对于内部表),可以使用
CASCADE 选项。
语法:
sql DROP DATABASE [IF EXISTS] database_name CASCADE;
警告:这是一个非常危险的操作!
一旦执行,数据库及其
所有内容 (包括内部表的HDFS数据) 都将
被永久删除,
且通常无法恢复。
请务必三思而后行,并
确认你
真的要这样做。
示例:
sql -- 强制删除名为 staging_area 的数据库及其下的所有表和数据 DROP DATABASE IF EXISTS staging_area CASCADE; -- 命令执行成功,staging_area 数据库及其内容消失*六、练习
- 练习题 1: 创建一个名为
education_platform的数据库,并为其添加注释 "用于存储在线教育平台的数据"。 - 练习题 2: 创建一个名为
temporary_storage的数据库,并将其数据存储位置指定到 HDFS 路径/tmp/hive_temp_db。 - 练习题 3: 为
education_platform数据库添加一个属性contact_person,值为edu_admin@example.com。 - 练习题 4: 列出所有以
edu开头的数据库。 - 练习题 5: 查看
temporary_storage数据库的详细信息(包括属性,如果之前设置了的话)。 - 练习题 6: 切换当前会话到
education_platform数据库。 - 练习题 7: 创建一个名为
archived_data的数据库。稍后,尝试删除它(假设它是空的)。 - 练习题 8: 假设
temporary_storage数据库中意外地创建了一些表(我们这里不实际创建表,只是假设情况),现在需要彻底删除temporary_storage数据库及其所有潜在内容。写出对应的命令。
答案 1:
CREATE DATABASE education_platform COMMENT '用于存储在线教育平台的数据';答案 2:
-- 假设HDFS路径 /tmp/hive_temp_db 已存在或Hive用户有权限创建 CREATE DATABASE temporary_storage LOCATION '/tmp/hive_temp_db';答案 3:
ALTER DATABASE education_platform SET DBPROPERTIES ('contact_person' = 'edu_admin@example.com');答案 4:
SHOW DATABASES LIKE 'edu*';答案 5:
DESCRIBE DATABASE EXTENDED temporary_storage;答案 6:
USE education_platform;答案 7:
CREATE DATABASE archived_data; -- 稍后删除 (假设为空) DROP DATABASE IF EXISTS archived_data;答案 8:
-- 强制删除 temporary_storage 数据库及其所有内容 DROP DATABASE IF EXISTS temporary_storage CASCADE;