💡 使用 SQL 即可定义扩维操作,实现 ODS 更新立即扩维并更新至 DWD 层,使用简单,实时性更高。
扩维是数据仓库建模中的一项重要操作。
根据经典的数据仓库建模理论,在通过 ETL(提取、转换、加载)过程将交易系统的数据加载至数据仓库的 ODS(贴源层)层后,下一步通常是对 ODS 层的原始交易数据进行扩维处理。扩维的目的是通过加入更多的维度信息,形成信息更为完备的“大宽表”。这些“大宽表”数据随后被写入 DWD(明细层),为进一步的数据分析和计算提供了结构化的基础数据。通过扩维处理,能够加速数据分析过程,提高多维度分析的效率和准确性。
过去,扩维操作通常采用“跑批”的方式进行处理。具体而言,在 ETL 过程完成后,通常会在非高峰时段(如晚上)使用调度工具执行 SQL 语句,批量地将当天的新增数据进行扩维处理,并写入 DWD 层。这种方式依赖于定时批处理任务,适用于数据量较大且更新频率较低的场景,但在实时性要求较高的应用中存在一定的局限性。
通过 Domino 流计算技术,我们可以使用 SQL 定义扩维操作,实现 ODS 到 DWD 是实时扩维更新,从而避免了“跑批”操作,无需调度,不但实时性更佳,而且无需第三方工具,大大降低了系统复杂度和运维成本。
如果再通过 CDC 工具将交易系统的数据实时更新至 ODS 仓中,配合流计算,就能使数仓真正具备“实时分析”的能力。
作为介绍 Domino 流计算的第一篇文章,我们就从最基本的扩维操作开始,通过一个简单对订单 + 商品信息 执行 JOIN 扩维操作的例子,演示 Domino 的使用方法和带来的效果。
表结构
ods_order
订单信息:存储订单信息的事实表;
dim_prod
商品信息:存储商品详细信息的维度表;
dwd_order_detail
订单详情:扩维后包含所有商品信息的订单详情表。
操作
- 第一步,让我们创建表
ods_order
和dim_prod
。
CREATE TABLE ods_order (
id int,
prod_id int,
ts timestamp
);
CREATE TABLE dim_prod (
id int,
prod_name text,
prod_detail text,
);
- 让我们创建流
dwd_order_detail
,通过商品信息对原始交易数据进行数据扩维。当ods_order
有新数据插入时,dwd_order_detail
会即时增量刷新,最新的、经过扩维的交易信息会自动写入。
CREATE STREAM dwd_order_detail(id, ts, prod_id, prod_name, prod_detail)
AS (
SELECT
ods_order.id,
ods_order.ts,
ods_order.prod_id,
dim_prod.prod_name,
dim_prod.prod_detail
FROM STREAMING ALL ods_order
INNER JOIN dim_prod
ON ods_order.prod_id = dim_prod.id
) PRIMARY KEY (id);
- 准备商品数据
INSERT INTO dim_prod
VALUES (
1,
'apple',
'fruit_001'
);
INSERT INTO dim_prod
VALUES (
2,
'cola',
'drink_001'
);
- 让流表工作起来 - 插入操作
在第二步中我们通过
JOIN ods_order
和dim_prod
创建了流dwd_order_detail
,一旦我们向ods_order
中插入新数据,那么dwd_order_detail
表也会立即更新,展示出扩维后的新订单数据。
-- 订单 1
INSERT INTO ods_order
VALUES (
1,
1,
current_timestamp
);
-- 订单 2
INSERT INTO ods_order
VALUES (
2,
2,
current_timestamp
);
查询 dwd_order_detail
,我们刚刚写入的数据自动经过扩维更新至表中。
SELECT * FROM dwd_order_detail;
id | ts | prod_id | prod_name | prod_detail
----+----------------------------+---------+-----------+------------
1 | 2024-08-01 15:50:23.117737 | 1 | apple | fruit_001
2 | 2024-08-01 15:50:35.115252 | 2 | cola | drink_001
(2 rows)
- 让流工作起来 - 更新操作 除了 INSERT, 流的上游的 UPDATE 操作,也会自动更新至下游:
-- 更新 cola -> pepsi
UPDATE dim_prod SET prod_name = 'pepsi' WHERE id = 2;
查看结果
SELECT * FROM dwd_order_detail;
id | ts | prod_id | prod_name | prod_detail
----+----------------------------+---------+-----------+------------
1 | 2024-08-01 15:50:23.117737 | 1 | apple | fruit_001
2 | 2024-08-01 15:50:35.115252 | 2 | pepsi | drink_001
(2 rows)
- 让流表工作起来 - 删除操作
-- 删除订单2
DELETE FROM ods_order WHERE id = 2;
查看结果
SELECT * FROM dwd_order_detail;
id | ts | prod_id | prod_name | prod_detail
----+----------------------------+---------+-----------+------------
1 | 2024-08-01 15:50:23.117737 | 1 | apple | fruit_001
(1 row)
了解更多
Domino 流计算使用灵活,功能强大
- 用 WHERE 条件直接进行过滤
- 多表 JOIN, UNION 等均可使用
- 可选追踪 INSERT / UPDATE / DELETE 操作