在大数据时代,数据仓库(Data Warehouse, DW)已成为企业进行数据分析、商业智能(BI)和决策支持的核心基础设施。而要高效地管理和使用数据仓库,掌握其基础的数据定义语言(DDL)和数据操作语言(DML)至关重要。本文将深入介绍在大数据数仓环境中(以 Hive、Spark SQL 等为代表),DDL 与 DML 的基本概念、常用语法及其实际应用场景。


一、什么是 DDL 和 DML?

1. DDL:数据定义语言(Data Definition Language)

DDL 用于定义或修改数据库结构,即“建什么”。它不涉及具体数据内容,而是关注表、视图、索引等对象的创建、修改和删除。

常见的 DDL 操作包括:

  • CREATE:创建数据库、表、视图等
  • ALTER:修改表结构(如添加字段)
  • DROP:删除表或数据库
  • TRUNCATE:清空表中所有数据(保留结构)

🔍 举例:就像盖房子前的设计图纸 —— 先规划房间布局(数据库结构),再施工。

2. DML:数据操作语言(Data Manipulation Language)

DML 用于对表中的数据进行增删改查操作,即“做什么”。它是数据分析人员最常使用的部分。

常见的 DML 操作包括:

  • SELECT:查询数据(最常用)
  • INSERT:插入新数据
  • UPDATE / DELETE:更新或删除数据(在大数据平台中有限支持)
  • MERGE / UPSERT:合并数据(现代数仓支持)

🔍 举例:房子建好后,往里面搬家具、打扫卫生、查看物品 —— 都属于 DML 行为。


二、大数据数仓中的 DDL 实践(以 Hive/Spark SQL 为例)

在 Hadoop 生态中,Hive 和 Spark SQL 是最常见的 SQL 接口工具,它们支持类 SQL 语法来管理数据仓库。

1. 创建数据库

CREATE DATABASE IF NOT EXISTS dw_sales 
COMMENT '销售数据仓库' 
LOCATION '/user/hive/warehouse/dw_sales.db';

✅ 说明:指定数据库名称、描述信息及 HDFS 存储路径。


2. 创建表(支持分区、分桶优化性能)

CREATE TABLE IF NOT EXISTS dw_sales.fact_orders (
    order_id STRING COMMENT '订单编号',
    user_id STRING COMMENT '用户ID',
    amount DECIMAL(10,2),
    order_date DATE,
    province STRING
)
PARTITIONED BY (dt STRING) -- 按天分区
CLUSTERED BY (user_id) INTO 8 BUCKETS -- 分桶
STORED AS ORC; -- 使用列式存储格式,提升查询效率

💡 提示:

  • PARTITIONED BY 提高查询效率(避免全表扫描)
  • STORED AS ORC/PARQUET 减少 I/O,压缩率高
  • CLUSTERED BY 用于大表 Join 时的性能优化

3. 修改表结构(ALTER)

-- 添加新字段
ALTER TABLE dw_sales.fact_orders ADD COLUMNS (payment_method STRING);

-- 修改表名
ALTER TABLE dw_sales.fact_orders RENAME TO fact_orders_new;

4. 删除表或清空数据

-- 删除整个表(结构+数据)
DROP TABLE IF EXISTS dw_sales.fact_orders;

-- 清空表中所有数据(仅限支持 ACID 的表)
TRUNCATE TABLE dw_sales.fact_orders;

⚠️ 注意:传统 Hive 表默认不支持 TRUNCATE,需启用事务特性(Hive 0.14+)。


三、大数据数仓中的 DML 实践

1. 数据插入(INSERT)

方式一:从查询结果插入(最常见)
INSERT OVERWRITE TABLE dw_sales.fact_orders PARTITION (dt='2025-04-05')
SELECT 
    order_id,
    user_id,
    amount,
    order_date,
    province,
    'online' AS payment_method
FROM ods.ods_orders_staging 
WHERE order_date = '2025-04-05';

✅ INSERT OVERWRITE:覆盖写入指定分区
✅ INSERT INTO:追加写入(适用于动态分区)

方式二:静态分区批量加载
-- 可同时写多个分区(Spark/Hive 支持)
FROM ods.ods_orders_staging
INSERT OVERWRITE TABLE dw_sales.fact_orders PARTITION (dt='2025-04-05') 
    SELECT * WHERE dt='2025-04-05'
INSERT OVERWRITE TABLE dw_sales.fact_orders PARTITION (dt='2025-04-06') 
    SELECT * WHERE dt='2025-04-06';

2. 数据查询(SELECT)

-- 典型分析查询:每日销售额统计
SELECT 
    dt,
    province,
    SUM(amount) AS total_sales,
    COUNT(*) AS order_count
FROM dw_sales.fact_orders 
WHERE dt BETWEEN '2025-04-01' AND '2025-04-07'
GROUP BY dt, province
ORDER BY total_sales DESC;

📊 这是 BI 报表、数据看板的基础来源。


3. 更新与删除(受限但可用)

早期 Hive 不支持行级 UPDATE/DELETE,但从 Hive 0.14 起引入了 ACID 事务,可在满足条件的情况下使用:

-- 启用事务的前提:表必须是 ORC 格式且开启事务属性
SET hive.support.concurrency = true;
SET hive.enforce.bucketing = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

-- 更新示例
UPDATE dw_sales.fact_orders 
SET payment_method = 'credit_card' 
WHERE order_id = 'ORD1001';

-- 删除示例
DELETE FROM dw_sales.fact_orders WHERE dt < '2024-01-01';

⚠️ 局限性:

  • 性能较低,不适合高频操作
  • 建议仅用于合规清理、主数据修正等场景
  • 更推荐使用“插入新版本 + 替换旧分区”的方式实现逻辑更新

4. MERGE 操作(现代数仓趋势)

在 Delta Lake、Iceberg、Hudi 等湖仓一体(Lakehouse)架构中,支持 MERGE INTO 实现 upsert(存在则更新,否则插入):

MERGE INTO dw_sales.dim_users AS target
USING staging_users AS source
ON target.user_id = source.user_id
WHEN MATCHED THEN
    UPDATE SET *
WHEN NOT MATCHED THEN
    INSERT *;

✅ 这是实现实时维度表更新的关键手段。


四、DDL 与 DML 在数仓分层中的应用

典型的数仓分层架构(如 ODS → DWD → DWS → ADS)中,DDL 和 DML 扮演不同角色:

层级主要任务典型 DDL典型 DML
ODS(贴源层)原始数据接入CREATE EXTERNAL TABLEINSERT OVERWRITE(每日同步)
DWD(明细层)清洗、标准化CREATE TABLE with partitionINSERT SELECT(ETL清洗)
DWS(汇总层)轻度聚合CREATE MATERIALIZED VIEW(模拟)GROUP BY 统计
ADS(应用层)面向报表输出CREATE TABLE for reportSELECT 查询驱动 BI

五、最佳实践建议

  1. 先设计再建模:使用 DDL 明确字段类型、分区策略、存储格式。
  2. 合理分区:按时间或业务维度分区,避免小文件问题。
  3. 优先使用 INSERT OVERWRITE 实现代替 UPDATE,提高稳定性。
  4. 定期维护元数据:通过 DESCRIBE TABLE 查看结构,保持文档同步。
  5. 结合调度工具:使用 Airflow、DolphinScheduler 自动执行 DML 脚本。

六、总结

对比项DDL(数据定义语言)DML(数据操作语言)
核心作用定义数据结构操作数据内容
关键语句CREATE, ALTER, DROPSELECT, INSERT, UPDATE, DELETE
使用频率初期集中使用,后期较少日常高频使用
影响范围表结构变更,影响下游依赖数据变化,影响分析结果
工具支持Hive、Spark SQL、Flink SQL 等同上
应用阶段数仓建模阶段ETL 加工 & 数据分析阶段

在大数据数仓体系中,DDL 是骨架,DML 是血液。只有科学地使用 DDL 构建稳定高效的表结构,并通过规范的 DML 完成数据流转与加工,才能真正发挥数据的价值。

掌握这两类语言,不仅是数据工程师的基本功,也是数据分析师理解数据来源和质量的重要桥梁。

更多推荐