在 Apache Hive 中,数据库 (Database),有时也被称为模式 (Schema),是组织和管理 表及其他对象的基本命名空间单元。熟练掌握数据库层面的数据定义语言 (DDL) 操作,是构建清晰、有序的 Hive 数据仓库的第一步。本篇笔记将详细梳理 Hive 数据库的各种 DDL 语法及其应用实例。
创建数据库是最基本的操作,它为你的数据表提供了一个逻辑容器。
CREATE DATABASE [IF NOT EXISTS] database_name;
SCHEMA
关键字 (等效):CREATE SCHEMA [IF NOT EXISTS] database_name;
IF NOT EXISTS
:如果尝试创建一个已存在的数据库,加上此子句可以避免抛出错误,命令会静默地不执行任何操作。若不加且数据库已存在,则会报错。database_name
: 你为数据库设定的唯一名称。命名规则通常遵循字母、数字和下划线的组合,不建议使用特殊字符或 Hive 关键字。-- 创建一个名为 hr_system 的数据库
CREATE DATABASE hr_system;
-- 尝试创建一个名为 sales_data 的数据库,如果它不存在
CREATE DATABASE IF NOT EXISTS sales_data;
-- 使用 SCHEMA 关键字创建
CREATE SCHEMA IF NOT EXISTS marketing_campaigns;
CREATE DATABASE [IF NOT EXISTS] database_name
COMMENT '这是一个描述性的注释';
CREATE DATABASE IF NOT EXISTS finance_department
COMMENT '存储所有财务相关数据的数据库';
hive-site.xml
中的 hive.metastore.warehouse.dir
指定的数据仓库根目录) 下为每个数据库创建一个同名的子目录 (通常是 database_name.db
) 来存放该数据库下所有表的数据。你可以通过 LOCATION
子句来覆盖这个默认行为,将数据库的数据文件存储在 HDFS 的特定路径下。
CREATE DATABASE [IF NOT EXISTS] database_name
LOCATION 'hdfs_absolute_path';
hdfs_absolute_path
: 必须是 HDFS 上的一个绝对路径。Hive 不会自动创建这个路径,你需要确保该路径已存在或者 Hive 用户有权限在该父目录下创建子目录。-- 确保 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 中,可以用于记录一些额外的信息。
CREATE DATABASE [IF NOT EXISTS] database_name
WITH DBPROPERTIES (
'property_name1' = 'property_value1',
'property_name2' = 'property_value2',
...
);
CREATE DATABASE IF NOT EXISTS gaming_stats
WITH DBPROPERTIES (
'owner' = 'GameDevTeam',
'created_date' = '2023-10-28',
'data_sensitivity' = 'medium'
);
CREATE DATABASE IF NOT EXISTS retail_analytics
COMMENT '零售业务分析数据库'
LOCATION '/dw/retail_data'
WITH DBPROPERTIES (
'data_source' = 'Multiple POS Systems',
'refresh_frequency' = 'daily'
);
创建完数据库后,我们需要方法来查看和了解它们的信息。
SHOW DATABASES;
SCHEMAS
(等效):SHOW SCHEMAS;
SHOW DATABASES;
-- 可能的输出:
-- default
-- finance_department
-- hr_system
-- marketing_campaigns
-- my_project_db
-- project_alpha_db
-- retail_analytics
-- sales_data
-- gaming_stats
LIKE
子句和通配符 (*
匹配任意字符序列,|
用于分隔多个模式) 来过滤显示的数据库名称。
SHOW DATABASES LIKE 'pattern_with_wildcards';
-- 显示所有以 "sales" 开头的数据库
SHOW DATABASES LIKE 'sales*';
-- 显示名为 "hr_system" 或 "finance_department" 的数据库
SHOW DATABASES LIKE 'hr_system|finance_department';
DESCRIBE DATABASE database_name;
SCHEMA
(等效):DESCRIBE SCHEMA database_name;
EXTENDED
关键字可以查看数据库的所有属性 (DBPROPERTIES)。DESCRIBE DATABASE EXTENDED database_name;
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)
三、切换和使用数据库 ➡️
在进行表操作之前,通常需要先指定要操作的当前数据库。
USE database_name;
database_name
。之后所有不显式指定数据库的表操作 (如 CREATE TABLE my_table ...
) 都会在该数据库下执行。USE retail_analytics;
-- 后续的 SHOW TABLES; CREATE TABLE some_table ...; 等命令都将在 retail_analytics 数据库上下文中执行
SELECT current_database();
SELECT current_database();
-- 输出可能为: retail_analytics (如果之前执行了 USE retail_analytics;)
四、修改数据库属性 (ALTER DATABASE / SCHEMA) ✏️
一旦数据库创建完成,你仍然可以修改它的一些属性,最常用的是修改 DBPROPERTIES
。
注意:直接修改数据库的 LOCATION
或 COMMENT
通常不被直接支持或操作复杂/有风险,这些属性一般在创建时就确定好。
ALTER DATABASE database_name SET DBPROPERTIES (
'property_name1' = 'new_value1',
'property_name2' = 'new_value2',
...
);
SCHEMA
(等效):ALTER SCHEMA database_name SET DBPROPERTIES (...);
-- 为 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) ️
删除数据库是一个需要非常谨慎的操作,因为它可能导致 大量数据和元数据的丢失。
DROP DATABASE [IF EXISTS] database_name;
SCHEMA
(等效):DROP SCHEMA [IF EXISTS] database_name;
DROP DATABASE
默认采用 RESTRICT
行为。这意味着如果数据库中包含任何表,删除操作会失败并报错,以防止意外删除有内容的数据库。-- 假设 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.
CASCADE
选项。
DROP DATABASE [IF EXISTS] database_name CASCADE;
-- 强制删除名为 staging_area 的数据库及其下的所有表和数据
DROP DATABASE IF EXISTS staging_area CASCADE;
-- 命令执行成功,staging_area 数据库及其内容消失
六、练习一下吧!✏️
education_platform
的数据库,并为其添加注释 “用于存储在线教育平台的数据”。temporary_storage
的数据库,并将其数据存储位置指定到 HDFS 路径 /tmp/hive_temp_db
。education_platform
数据库添加一个属性 contact_person
,值为 [email protected]
。edu
开头的数据库。temporary_storage
数据库的详细信息(包括属性,如果之前设置了的话)。education_platform
数据库。archived_data
的数据库。稍后,尝试删除它(假设它是空的)。temporary_storage
数据库中意外地创建了一些表(我们这里不实际创建表,只是假设情况),现在需要彻底删除 temporary_storage
数据库及其所有潜在内容。写出对应的命令。七、练习题答案 ✅
CREATE DATABASE education_platform
COMMENT '用于存储在线教育平台的数据';
-- 假设HDFS路径 /tmp/hive_temp_db 已存在或Hive用户有权限创建
CREATE DATABASE temporary_storage
LOCATION '/tmp/hive_temp_db';
ALTER DATABASE education_platform SET DBPROPERTIES ('contact_person' = '[email protected]');
SHOW DATABASES LIKE 'edu*';
DESCRIBE DATABASE EXTENDED temporary_storage;
USE education_platform;
CREATE DATABASE archived_data;
-- 稍后删除 (假设为空)
DROP DATABASE IF EXISTS archived_data;
-- 强制删除 temporary_storage 数据库及其所有内容
DROP DATABASE IF EXISTS temporary_storage CASCADE;