在 Apache Hive 中,數據庫 (Database),有時也被稱為模式 (Schema),是組織和管理 表及其他對象的基本命名空間單元。熟練掌握數據庫層面的數據定義語言 (DDL) 操作,是構建清晰、有序的 Hive 數據倉庫的第一步。本篇筆記將詳細梳理 Hive 數據庫的各種 DDL 語法及其應用實例。
一、創建數據庫 (CREATE DATABASE / SCHEMA) 🏗?
創建數據庫是最基本的操作,它為你的數據表提供了一個邏輯容器。
- 1. 基本創建語法
- 語法:
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;
- 2. 創建數據庫并添加注釋 (COMMENT)
為數據庫添加注釋是一個良好的實踐,有助于理解數據庫的用途。- 語法:
CREATE DATABASE [IF NOT EXISTS] database_name
COMMENT '這是一個描述性的注釋';
- 示例:
CREATE DATABASE IF NOT EXISTS finance_department
COMMENT '存儲所有財務相關數據的數據庫';
- 3. 創建數據庫并指定存儲位置 (LOCATION)
默認情況下,Hive 會在配置文件 (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'
);
- 5. 組合使用所有子句
當然,你可以組合使用以上各種可選子句。- 示例:
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)
- 語法:
SHOW DATABASES;
- 或使用
SCHEMAS
(等效):
SHOW SCHEMAS;
- 作用: 顯示當前 Hive Metastore 中存在的所有數據庫的列表。
- 示例:
SHOW DATABASES;
-- 可能的輸出:
-- default
-- finance_department
-- hr_system
-- marketing_campaigns
-- my_project_db
-- project_alpha_db
-- retail_analytics
-- sales_data
-- gaming_stats
- 2. 過濾數據庫列表 (LIKE)
你可以使用LIKE
子句和通配符 (*
匹配任意字符序列,|
用于分隔多個模式) 來過濾顯示的數據庫名稱。- 語法:
SHOW DATABASES LIKE 'pattern_with_wildcards';
- 示例:
-- 顯示所有以 "sales" 開頭的數據庫
SHOW DATABASES LIKE 'sales*';-- 顯示名為 "hr_system" 或 "finance_department" 的數據庫
SHOW DATABASES LIKE 'hr_system|finance_department';
- 3. 查看數據庫詳細信息 (DESCRIBE DATABASE / SCHEMA)
獲取某個特定數據庫的詳細描述。- 基本語法:
DESCRIBE DATABASE database_name;
- 或使用
SCHEMA
(等效):
DESCRIBE SCHEMA database_name;
- 顯示更詳細信息 (EXTENDED): 使用
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)
三、切換和使用數據庫 ??
在進行表操作之前,通常需要先指定要操作的當前數據庫。
- 1. 切換當前數據庫 (USE)
- 語法:
USE database_name;
- 作用: 將當前 Hive 會話的默認數據庫設置為
database_name
。之后所有不顯式指定數據庫的表操作 (如CREATE TABLE my_table ...
) 都會在該數據庫下執行。 - 示例:
USE retail_analytics;
-- 后續的 SHOW TABLES; CREATE TABLE some_table ...; 等命令都將在 retail_analytics 數據庫上下文中執行
- 2. 查看當前數據庫 (CURRENT_DATABASE())
如果你不確定當前工作在哪個數據庫下,可以使用這個內置函數。- 語法:
SELECT current_database();
- 示例:
SELECT current_database();
-- 輸出可能為: retail_analytics (如果之前執行了 USE retail_analytics;)
四、修改數據庫屬性 (ALTER DATABASE / SCHEMA) ??
一旦數據庫創建完成,你仍然可以修改它的一些屬性,最常用的是修改 DBPROPERTIES
。
注意:直接修改數據庫的 LOCATION
或 COMMENT
通常不被直接支持或操作復雜/有風險,這些屬性一般在創建時就確定好。
- 1. 修改數據庫屬性 (SET DBPROPERTIES)
- 語法:
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) 🗑?
刪除數據庫是一個需要非常謹慎的操作,因為它可能導致 大量數據和元數據的丟失。
- 1. 基本刪除語法
- 語法:
DROP DATABASE [IF EXISTS] database_name;
- 或使用
SCHEMA
(等效):
DROP SCHEMA [IF EXISTS] database_name;
- 默認行為 (RESTRICT): 如果不加任何額外選項,
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.
- 2. 強制刪除數據庫及其內容 (CASCADE)
如果你確定要刪除數據庫以及其中包含的所有表和數據 (對于內部表),可以使用CASCADE
選項。- 語法:
DROP DATABASE [IF EXISTS] database_name CASCADE;
- ?? 警告:這是一個非常危險的操作! 一旦執行,數據庫及其所有內容 (包括內部表的HDFS數據) 都將被永久刪除,且通常無法恢復。請務必三思而后行,并確認你真的要這樣做。
- 示例:
-- 強制刪除名為 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;