Domino 流计算快速上手 - 1. 扩维

2024-11-01 · YMatrix Team
#产品动态

💡 使用 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 订单详情:扩维后包含所有商品信息的订单详情表。

操作

  1. 第一步,让我们创建表 ods_orderdim_prod
CREATE TABLE ods_order (
   id int,
   prod_id int,
   ts timestamp
   );

CREATE TABLE dim_prod (
    id int, 
    prod_name text,
    prod_detail text,
 );
  1. 让我们创建流 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);
  1. 准备商品数据
INSERT INTO dim_prod 
VALUES (
    1,
    'apple',
    'fruit_001'
);

INSERT INTO dim_prod 
VALUES (
    2,
    'cola',
    'drink_001'
);
  1. 让流表工作起来 - 插入操作 在第二步中我们通过 JOIN ods_orderdim_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)
  1. 让流工作起来 - 更新操作 除了 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)
  1. 让流表工作起来 - 删除操作
-- 删除订单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 流计算使用灵活,功能强大

  1. 用 WHERE 条件直接进行过滤
  2. 多表 JOIN, UNION 等均可使用
  3. 可选追踪 INSERT / UPDATE / DELETE 操作