CREATE TABLE IF NOT EXISTS doc_orders (
order_id STRING,
user_id STRING,
product_id STRING,
quantity INT,
unit_price DECIMAL(10,2),
amount DECIMAL(10,2),
order_time TIMESTAMP,
status STRING
);
CREATE TABLE IF NOT EXISTS doc_products (
product_id STRING,
product_name STRING,
category STRING,
brand STRING
);
插入初始数据
INSERT INTO doc_products VALUES
('P001', '无线蓝牙耳机', '数码配件', 'SoundMax'),
('P002', '机械键盘', '电脑外设', 'KeyPro'),
('P003', '运动跑鞋', '运动户外', 'SpeedRun'),
('P004', '瑜伽垫', '运动户外', 'FlexFit'),
('P005', '保温杯', '家居生活', 'ThermoKeep'),
('P006', 'USB-C 充电器', '数码配件', 'ChargeFast'),
('P007', '笔记本支架', '电脑外设', 'DeskPro'),
('P008', '跳绳', '运动户外', 'JumpFit');
INSERT INTO doc_orders VALUES
('O001','U101','P001',2,299.00,598.00, CAST('2026-05-28 16:00:00' AS TIMESTAMP),'completed'),
('O002','U102','P002',1,459.00,459.00, CAST('2026-05-28 16:05:00' AS TIMESTAMP),'completed'),
('O003','U103','P003',1,389.00,389.00, CAST('2026-05-28 16:10:00' AS TIMESTAMP),'completed'),
('O004','U104','P001',1,299.00,299.00, CAST('2026-05-28 16:15:00' AS TIMESTAMP),'completed'),
('O005','U105','P004',2,128.00,256.00, CAST('2026-05-28 16:20:00' AS TIMESTAMP),'completed'),
('O006','U106','P005',3, 89.00,267.00, CAST('2026-05-28 16:25:00' AS TIMESTAMP),'completed'),
('O007','U107','P006',2,129.00,258.00, CAST('2026-05-28 16:30:00' AS TIMESTAMP),'completed'),
('O008','U108','P003',2,389.00,778.00, CAST('2026-05-28 16:35:00' AS TIMESTAMP),'completed'),
('O009','U109','P007',1,199.00,199.00, CAST('2026-05-28 16:40:00' AS TIMESTAMP),'completed'),
('O010','U110','P008',3, 49.00,147.00, CAST('2026-05-28 16:45:00' AS TIMESTAMP),'completed');
⚠️ 注意:TIMESTAMP 列插入时必须用
CAST('...' AS TIMESTAMP)
CAST('...' AS TIMESTAMP)
,不接受字符串字面量直接写入。
场景一:创建三层 Dynamic Table
第一层(DWD):订单打宽
将订单表与商品表 JOIN,补充品类和品牌信息,只保留已完成的订单。
CREATE OR REPLACE DYNAMIC TABLE doc_dwd_order_detail
REFRESH INTERVAL '1' MINUTE VCLUSTER default
AS
SELECT
o.order_id,
o.user_id,
o.product_id,
p.product_name,
p.category,
p.brand,
o.quantity,
o.unit_price,
o.amount,
o.order_time,
o.status
FROM doc_orders o
JOIN doc_products p ON o.product_id = p.product_id
WHERE o.status = 'completed';
第二层(ADS):品类 GMV 汇总
按品类聚合,计算订单数、销量、GMV 和均价。
CREATE OR REPLACE DYNAMIC TABLE doc_ads_category_gmv
REFRESH INTERVAL '1' MINUTE VCLUSTER default
AS
SELECT
category,
COUNT(DISTINCT order_id) AS order_cnt,
SUM(quantity) AS total_qty,
SUM(amount) AS gmv,
CAST(SUM(amount) / SUM(quantity) AS DECIMAL(10,2)) AS avg_price
FROM doc_dwd_order_detail
GROUP BY category;
⚠️ 注意:均价计算需用
CAST(SUM(amount) / SUM(quantity) AS DECIMAL(10,2))
CAST(SUM(amount) / SUM(quantity) AS DECIMAL(10,2))
显式指定精度。直接用
ROUND(SUM(amount)/SUM(quantity), 2)
ROUND(SUM(amount)/SUM(quantity), 2)
会触发优化器类型推断错误。
第三层(ADS):品类排行榜
基于 GMV 汇总表计算实时排名。
CREATE OR REPLACE DYNAMIC TABLE doc_ads_category_rank
REFRESH INTERVAL '1' MINUTE VCLUSTER default
AS
SELECT
RANK() OVER (ORDER BY gmv DESC) AS gmv_rank,
category,
order_cnt,
total_qty,
gmv,
avg_price
FROM doc_ads_category_gmv;
INSERT INTO doc_orders VALUES
('O011','U111','P005',2, 89.00,178.00, CAST('2026-05-28 17:00:00' AS TIMESTAMP),'completed'),
('O012','U112','P006',3,129.00,387.00, CAST('2026-05-28 17:02:00' AS TIMESTAMP),'completed'),
('O013','U113','P001',1,299.00,299.00, CAST('2026-05-28 17:05:00' AS TIMESTAMP),'completed'),
('O014','U114','P004',1,128.00,128.00, CAST('2026-05-28 17:08:00' AS TIMESTAMP),'completed'),
('O015','U115','P002',2,459.00,918.00, CAST('2026-05-28 17:10:00' AS TIMESTAMP),'completed');
等待约 2 分钟,再次查询排行榜:
SELECT * FROM doc_ads_category_rank ORDER BY gmv_rank;
适合用 OR REPLACE 的改动:修改 WHERE 过滤条件、新增透传列(直接来自上游的列,不参与计算)。
需要 DROP + 重建的改动:修改列类型、修改聚合逻辑(如新增
avg_price
avg_price
这类计算列)。
⚠️ 注意:OR REPLACE 不允许改变已有列的类型,会报
NotAllowed: cannot replace <col> from type X to Y
NotAllowed: cannot replace <col> from type X to Y
。如需改列类型,必须先 DROP 再重建。
OR REPLACE 后,若上游没有新数据写入,系统不会重算已有行——新列的值会保持 null,直到下次有新数据触发刷新时才一并计算。
查看刷新状态
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'doc_ads_category_rank' LIMIT 5;
实测返回示例:
state
refresh_mode
start_time
rows_inserted
含义
SUCCEED
INCREMENTAL
18:11:48
4
正常增量刷新,写入 4 行
SUCCEED
NO_DATA
18:12:48
—
上游无新数据,跳过计算
FAILED
FULL
18:09:41
—
全量刷新失败,见 error_message
关键字段说明:
字段
含义
state
state
SUCCEED
SUCCEED
成功 /
FAILED
FAILED
失败
refresh_mode
refresh_mode
INCREMENTAL
INCREMENTAL
增量 /
FULL
FULL
全量 /
NO_DATA
NO_DATA
无新数据跳过
refresh_trigger
refresh_trigger
SYSTEM_SCHEDULED
SYSTEM_SCHEDULED
自动调度 /
MANUAL
MANUAL
手动触发
start_time
start_time
/
end_time
end_time
刷新开始和结束时间
stats
stats
rows_inserted
rows_inserted
/
rows_deleted
rows_deleted
,本次写入和删除的行数
error_message
error_message
FAILED 时的错误详情
上游删除后的行为
删除上游 DT 后,下游 DT 不会报错、不会级联删除,刷新状态变为
NO_DATA
NO_DATA
,对象继续存在。
-- 删除 DWD 层
DROP DYNAMIC TABLE IF EXISTS doc_dwd_order_detail;
-- gmv 层仍然存在,但刷新变为 NO_DATA
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'doc_ads_category_gmv' LIMIT 3;
-- state: SUCCEED, refresh_mode: NO_DATA
DROP DYNAMIC TABLE IF EXISTS doc_ads_category_rank;
DROP DYNAMIC TABLE IF EXISTS doc_ads_category_gmv;
DROP DYNAMIC TABLE IF EXISTS doc_dwd_order_detail;
DROP TABLE IF EXISTS doc_orders;
DROP TABLE IF EXISTS doc_products;