三、Hive DDL数据库操作

0 阅读8分钟

在 Apache Hive 中,数据库,有时也被称为模式,是组织和管理 表及其他对象的基本命名空间单元。熟练掌握数据库层面的数据定义语言 (DDL) 操作,是构建清晰、有序的 Hive 数据仓库的第一步。

在这里插入图片描述

思维导图

在这里插入图片描述 在这里插入图片描述

一、创建数据库

创建数据库是最基本的操作,它为你的数据表提供了一个逻辑容器。

1. 基本创建语法

可以使用 DATABASESCHEMA 关键字(两者等效)。IF NOT EXISTS 用于避免数据库已存在时抛出错误。

-- 语法结构
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name;

-- 示例:创建一个名为 hr_system 的数据库
CREATE DATABASE hr_system;

-- 示例:尝试创建一个名为 sales_data 的数据库,如果它不存在
CREATE DATABASE IF NOT EXISTS sales_data;

-- 示例:使用 SCHEMA 关键字创建
CREATE SCHEMA IF NOT EXISTS marketing_campaigns;

2. 添加描述性注释

为数据库添加注释有助于团队成员理解数据库的用途。

CREATE DATABASE IF NOT EXISTS finance_department
COMMENT '存储所有财务相关数据的数据库';

3. 指定存储位置

默认情况下,Hive 会在数据仓库根目录(由 hive.metastore.warehouse.dir 控制)下创建一个同名子目录(.db 结尾)。你可以通过 LOCATION 指定 HDFS 上的绝对路径。

在这里插入图片描述

-- 确保 HDFS 路径 /data/project_alpha/db_storage 存在或可被创建
CREATE DATABASE IF NOT EXISTS project_alpha_db
LOCATION '/data/project_alpha/db_storage';

注意:指定后,该库下新创建的表默认会将数据存储在这个路径下。

4. 设置属性

可以为数据库关联自定义的键值对属性,用于记录额外信息(如创建人、日期、敏感级别等)。

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)

显示当前 Hive Metastore 中存在的所有数据库。

-- 列出所有数据库
SHOW DATABASES;

-- 使用 SCHEMAS 也可以
SHOW SCHEMAS;

2. 模糊过滤 (LIKE)

使用 LIKE 子句和通配符 (*) 来过滤名称。

-- 显示所有以 "sales" 开头的数据库
SHOW DATABASES LIKE 'sales*';

-- 显示名为 "hr_system" 或 "finance_department" 的数据库
SHOW DATABASES LIKE 'hr_system|finance_department';

3. 查看详细信息 (DESCRIBE)

获取特定数据库的详细描述。使用 EXTENDED 可以查看属性参数 (DBPROPERTIES)。

-- 基本查看
DESCRIBE DATABASE retail_analytics;

-- 查看详细信息(包含 owner, parameters 等)
DESCRIBE DATABASE EXTENDED gaming_stats;

三、切换和使用数据库

在进行表操作之前,通常需要先指定当前的工作上下文。

1. 切换数据库 (USE)

将当前会话的默认数据库设置为指定名称。

USE retail_analytics;
-- 后续的 CREATE TABLE 等命令都将在 retail_analytics 数据库下执行

2. 查看当前上下文

如果你不确定当前工作在哪个数据库下,使用内置函数查看。

SELECT current_database();

四、修改数据库属性 (ALTER DATABASE)

一旦创建,LOCATION 等核心属性通常不可更改,最常用的是修改 DBPROPERTIES

修改属性语法

可以添加新属性或更新已有属性。

-- 为 gaming_stats 数据库更新 owner 并添加一个新属性 last_reviewed_by
ALTER DATABASE gaming_stats SET DBPROPERTIES (
    'owner' = 'UpdatedGameTeamLead',
    'last_reviewed_by' = 'DataQualityTeam'
);

五、删除数据库 (DROP DATABASE)

删除数据库操作需要谨慎,因为可能导致数据丢失。

1. 默认删除 (RESTRICT)

如果不加额外选项,默认采用 RESTRICT 模式。如果数据库非空(包含表),操作将失败。

-- 假设 temp_db 中有表,以下命令会失败并报错
DROP DATABASE IF EXISTS temp_db;

2. 强制级联删除 (CASCADE)

如果你确定要删除数据库以及其中包含的所有表和数据,必须使用 CASCADE

-- 强制删除名为 staging_area 的数据库及其下的所有表和数据
--  警告:数据将被永久删除
DROP DATABASE IF EXISTS staging_area CASCADE;

六、常用命令总结表

操作类型关键字作用关键参数/注意
创建CREATE建立新数据库LOCATION (路径), WITH DBPROPERTIES (属性)
查看SHOW列出数据库LIKE 'pattern' (模糊匹配)
描述DESCRIBE查看元数据EXTENDED (显示详细属性)
切换USE切换当前库影响后续 SQL 上下文
修改ALTER修改元数据主要是 SET DBPROPERTIES
删除DROP删除数据库默认非空报错, CASCADE 级联删除

七、Hive DDL 专项练习题 (15题)

1. 在 Hive 中,用于切换当前工作数据库的命令是? A. SWITCH B. USE C. CONNECT D. SELECT

2. 默认情况下,如果删除一个包含表的数据库,Hive 会怎么做? A. 自动删除所有表 B. 提示确认 C. 报错并拒绝删除 D. 仅删除元数据,保留数据

3. 如果想要在删除数据库时,连同其中的所有表和数据一起删除,应使用哪个关键字? A. FORCE B. RECURSIVE C. CASCADE D. ALL

4. CREATE DATABASE 语句中,哪个子句用于指定数据库在 HDFS 上的存储路径? A. PATH B. DIRECTORY C. LOCATION D. STORED AS

5. 下列哪个命令可以查看数据库的详细信息,包括 DBPROPERTIES A. SHOW DATABASE DETAILS B. DESCRIBE DATABASE C. DESCRIBE DATABASE EXTENDED D. EXPLAIN DATABASE

6. Hive 中 DATABASESCHEMA 这两个关键字的关系是? A. SCHEMA 用于内部表,DATABASE 用于外部表 B. 完全等效,可以互换 C. SCHEMADATABASE 的子集 D. Hive 不支持 SCHEMA 关键字

7. 若要创建一个名为 test_db 的数据库,但不想在它已存在时报错,应如何编写 SQL? A. CREATE DATABASE test_db IGNORE ERROR; B. CREATE DATABASE IF NOT EXISTS test_db; C. CREATE OR REPLACE DATABASE test_db; D. TRY CREATE DATABASE test_db;

8. 修改数据库属性时,主要修改的是哪部分内容? A. 数据库名称 B. 数据库的所有者 C. LOCATION 路径 D. DBPROPERTIES 键值对

9. SHOW DATABASES LIKE 'pro*' 的作用是? A. 显示名为 pro* 的数据库 B. 显示所有以 pro 开头的数据库 C. 显示所有包含 pro 的数据库 D. 语法错误

10. Hive 的数据库元数据(如名称、位置、属性)存储在哪里? A. HDFS B. ZooKeeper C. Metastore (通常是 MySQL/Derby) D. YARN

11. 如果在创建数据库时未指定 LOCATION,默认路径通常受哪个配置项控制? A. hive.metastore.warehouse.dir B. fs.defaultFS C. hive.exec.scratchdir D. hadoop.tmp.dir

12. 以下哪个函数可以返回当前所在的数据库名称? A. get_database() B. current_db() C. current_database() D. database()

13. 关于 ALTER DATABASE,下列说法正确的是? A. 可以随意修改数据库的 LOCATION B. 可以修改数据库名称 C. 主要用于设置或修改 DBPROPERTIES D. 修改属性后需要重启 Hive 服务

14. 在 WITH DBPROPERTIES 中设置的属性主要用于什么目的? A. 控制用户权限 B. 优化查询性能 C. 记录描述性元数据(如创建者、备注) D. 定义数据存储格式

15. 当使用 USE db_name 后,执行 CREATE TABLE tab1 ...tab1 会被创建在哪里? A. default 数据库 B. db_name 数据库 C. 会报错,必须指定 db_name.tab1 D. 用户的主目录下


答案与解析

1.B. USE

解析: USE database_name 是标准的切换上下文命令。

2.C. 报错并拒绝删除

解析: 默认行为是 RESTRICT,为了防止误删数据,如果数据库非空,Hive 会抛出异常。

3.C. CASCADE

解析: CASCADE 关键字用于级联删除,会强制删除数据库及其包含的所有对象。

4.C. LOCATION

解析: LOCATION 子句用于覆盖默认的仓库路径,指定 HDFS 上的绝对路径。

5.C. DESCRIBE DATABASE EXTENDED

解析: 普通的 DESCRIBE 只显示基本信息,加上 EXTENDED 才能看到 DBPROPERTIES 中的参数。

6.B. 完全等效,可以互换

解析: 在 Hive QL 中,SCHEMADATABASE 的同义词,功能完全一致。

7.B. CREATE DATABASE IF NOT EXISTS test_db;

解析: IF NOT EXISTS 是标准的防重机制,如果存在则静默跳过。

8.D. DBPROPERTIES 键值对

解析: Hive 对修改 Name 和 Location 支持有限或不支持,ALTER DATABASE 最常用于修改自定义属性。

9.B. 显示所有以 pro 开头的数据库

解析: * 是通配符,pro* 匹配以 pro 起始的字符串。

10.C. Metastore (通常是 MySQL/Derby)

解析: 数据库的结构定义信息(元数据)存储在关系型数据库 Metastore 中,而实际数据存储在 HDFS。

11.A. hive.metastore.warehouse.dir

解析: 这是 hive-site.xml 中的关键配置,定义了数仓的根目录。

12.C. current_database()

解析: 这是 Hive 提供的内置函数,用于查看当前 Session 的上下文。

13.C. 主要用于设置或修改 DBPROPERTIES

解析: 选项 A 和 B 通常不被直接支持或受限,选项 C 是标准用法。

14.C. 记录描述性元数据(如创建者、备注)

解析: DBPROPERTIES 主要用于文档化和标记元数据,通常不直接影响查询优化或权限。

15.B. db_name 数据库

解析: USE 命令设置了当前会话的默认数据库,后续未指定限定符的表操作均在该库下进行。