@clickzetta/cz-cli-darwin-x64 0.3.75 → 0.3.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cz-cli +0 -0
- package/bin/skills/clickzetta-dynamic-table/SKILL.md +188 -126
- package/bin/skills/clickzetta-dynamic-table/best-practices/dimension-table-join-guide.md +7 -11
- package/bin/skills/clickzetta-dynamic-table/best-practices/scheduling-guide.md +135 -0
- package/bin/skills/clickzetta-dynamic-table/dt-creator/references/dt-declaration-strategy.md +8 -8
- package/bin/skills/clickzetta-dynamic-table/dt-creator/references/incremental-config-reference.md +2 -4
- package/bin/skills/clickzetta-dynamic-table/dt-creator/references/refresh-history-guide.md +2 -10
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/SKILL.md +27 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-column-validation-rules.md +118 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-conversion-rules.md +225 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-placeholder-rules.md +182 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-refresh-rules.md +98 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-self-reference-rules.md +76 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-workflow.md +109 -0
- package/bin/skills/cz-cli/SKILL.md +125 -0
- package/package.json +1 -1
package/bin/cz-cli
CHANGED
|
Binary file
|
|
@@ -1,168 +1,230 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: clickzetta-dynamic-table
|
|
3
3
|
description: |
|
|
4
|
-
ClickZetta Dynamic Table
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
ClickZetta Dynamic Table(动态表)使用指南与路由中心。
|
|
5
|
+
|
|
6
|
+
【触发场景】
|
|
7
|
+
- 通用咨询:动态表介绍、使用方式、最佳实践、性能优化、增量配置
|
|
8
|
+
- 创建指导:DT 声明策略、SQL 支持矩阵、刷新历史查询
|
|
9
|
+
- 修改操作:检测到后自动委托给 dynamic-table-alter 子技能
|
|
10
|
+
- SQL 转换:检测到后自动委托给 sql-to-dt 子技能
|
|
11
|
+
|
|
12
|
+
【触发关键词】
|
|
13
|
+
"动态表怎么用"、"DT 介绍"、"动态表最佳实践"、"动态表性能优化"、
|
|
14
|
+
"增量计算配置"、"维度表 JOIN"、"动态表刷新历史"、"静态分区 DT"、
|
|
15
|
+
"动态分区 DT"、"状态表管理"、"非分区表风险"、"创建动态表"、
|
|
16
|
+
"动态表调度"、"REFRESH INTERVAL"、"动态表告警"
|
|
17
|
+
|
|
18
|
+
【不触发场景】
|
|
19
|
+
修改操作("修改动态表"、"加列"、"改间隔"等)→ 使用 dynamic-table-alter
|
|
20
|
+
SQL转换("转换DT"、"INSERT OVERWRITE转DT"等)→ 使用 sql-to-dt
|
|
13
21
|
---
|
|
14
22
|
|
|
15
|
-
# Dynamic Table 使用指南 —
|
|
23
|
+
# Dynamic Table 使用指南 — 路由与索引
|
|
16
24
|
|
|
17
|
-
|
|
25
|
+
本技能是 ClickZetta 动态表的**知识中心和路由器**,根据用户意图提供参考文档或自动委托到专门的操作型子技能。
|
|
18
26
|
|
|
19
|
-
|
|
27
|
+
---
|
|
20
28
|
|
|
21
|
-
|
|
22
|
-
-- 查看所有 VCluster 及其状态
|
|
23
|
-
SHOW VCLUSTERS;
|
|
24
|
-
-- 关注列:name, type, status
|
|
25
|
-
-- type = GENERAL(GP 型,推荐用于动态表)
|
|
26
|
-
-- status = RUNNING(正常)或 STOPPED(已停止,需先启动)
|
|
27
|
-
```
|
|
29
|
+
## 使用场景分类
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
- 找到 `type = GENERAL` 且 `status = RUNNING` 的集群名称,用于 `vcluster <name>`
|
|
31
|
-
- 如果目标集群 `status = STOPPED`,先执行:`ALTER VCLUSTER <name> RESUME;`
|
|
32
|
-
- 如果没有 GP 型集群,需先创建:参考 `clickzetta-vcluster-manager` skill
|
|
31
|
+
### 1. 通用咨询与学习(本技能处理)
|
|
33
32
|
|
|
34
|
-
|
|
33
|
+
**适用场景:**
|
|
34
|
+
- 需要查询最佳实践和性能优化建议
|
|
35
|
+
- 寻找特定配置项的说明文档
|
|
36
|
+
- 学习如何创建动态表
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
**触发关键词:**
|
|
39
|
+
- "动态表怎么用"、"DT 介绍"、"Dynamic Table 是什么"
|
|
40
|
+
- "动态表最佳实践"、"DT 性能优化"、"动态表性能调优"
|
|
41
|
+
- "增量计算配置"、"刷新策略"、"状态表管理"
|
|
42
|
+
- "维度表 JOIN 怎么配置"、"非分区表风险"
|
|
43
|
+
- "动态表刷新历史怎么查"、"REFRESH HISTORY"
|
|
44
|
+
- "静态分区 DT"、"动态分区 DT"、"DT 声明策略"
|
|
45
|
+
- "动态表支持哪些 SQL"、"动态表 SQL 限制"
|
|
46
|
+
- "创建动态表"、"新建动态表"、"CREATE DYNAMIC TABLE"
|
|
37
47
|
|
|
38
|
-
|
|
39
|
-
-- 1. 创建 Dynamic Table(自动调度刷新)
|
|
40
|
-
CREATE DYNAMIC TABLE IF NOT EXISTS silver.orders_daily
|
|
41
|
-
REFRESH INTERVAL 60 MINUTE vcluster default
|
|
42
|
-
AS
|
|
43
|
-
SELECT DATE(created_at) AS order_date, region, SUM(amount) AS total_amount
|
|
44
|
-
FROM bronze.raw_orders
|
|
45
|
-
GROUP BY 1, 2;
|
|
48
|
+
**处理方式:** 提供相关参考文档的内容和指引。
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
DESC DYNAMIC TABLE silver.orders_daily;
|
|
49
|
-
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'orders_daily' LIMIT 10;
|
|
50
|
+
---
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
REFRESH DYNAMIC TABLE silver.orders_daily;
|
|
52
|
+
### 2. 修改现有动态表(自动委托给 dynamic-table-alter 子技能)
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
**适用场景:**
|
|
55
|
+
- 需要修改已存在的动态表结构或属性
|
|
56
|
+
- 暂停/恢复动态表刷新
|
|
57
|
+
- 添加/删除列、修改刷新间隔、修改查询定义
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
**触发关键词:**
|
|
60
|
+
- "修改动态表"、"动态表加列"、"动态表删列"
|
|
61
|
+
- "改刷新间隔"、"修改 REFRESH_INTERVAL"
|
|
62
|
+
- "暂停动态表"、"恢复动态表"、"SUSPEND"、"RESUME"
|
|
63
|
+
- "重命名列"、"修改列注释"、"修改表注释"
|
|
64
|
+
- "ALTER DYNAMIC TABLE"、"CREATE OR REPLACE DYNAMIC TABLE"
|
|
65
|
+
- "修改 DT 查询定义"、"修改 AS SELECT"
|
|
62
66
|
|
|
63
|
-
|
|
67
|
+
**处理方式:**
|
|
68
|
+
> ⚠️ 检测到修改操作意图,应立即加载 dynamic-table-alter 子技能。
|
|
69
|
+
> 该子技能提供完整的 10 种修改操作工作流:
|
|
70
|
+
> - 5种直接 ALTER:suspend、resume、set_comment、rename_column、set_column_comment
|
|
71
|
+
> - 5种 CREATE OR REPLACE:add_column、drop_column、alter_column、set_refresh_interval、set_select
|
|
64
72
|
|
|
65
|
-
|
|
66
|
-
|---|---|---|
|
|
67
|
-
| 自动调度 | `REFRESH INTERVAL 10 MINUTE vcluster <name>` | 系统按间隔自动刷新(推荐) |
|
|
68
|
-
| 指定开始时间 | `REFRESH START WITH TIMESTAMP '2025-01-01 00:00:00' INTERVAL 1 HOUR vcluster <name>` | 从指定时间开始调度 |
|
|
69
|
-
| 手动触发 | `REFRESH DYNAMIC TABLE my_dt;` | 外部调度器触发,适合静态分区 DT |
|
|
73
|
+
---
|
|
70
74
|
|
|
71
|
-
|
|
75
|
+
### 3. SQL 转换为动态表(自动委托给 sql-to-dt 子技能)
|
|
76
|
+
|
|
77
|
+
**适用场景:**
|
|
78
|
+
- 将 Hive/Spark 等任意批处理系统的 CREATE TABLE + INSERT OVERWRITE 转换为 DT
|
|
79
|
+
- 批量迁移传统 ETL 到动态表
|
|
80
|
+
- 自动生成 refresh、backfill 等配套文件
|
|
81
|
+
|
|
82
|
+
**触发关键词:**
|
|
83
|
+
- "转换 DT"、"sql to dt"、"convert to dynamic table"
|
|
84
|
+
- "INSERT OVERWRITE 转 DT"、"DDL 转换"
|
|
85
|
+
- "Hive SQL 转 ClickZetta"、"Spark SQL 转动态表"
|
|
86
|
+
- "批量转换 ETL"、"迁移到动态表"
|
|
87
|
+
- "创建动态表"、"新建动态表"、"CREATE DYNAMIC TABLE"
|
|
88
|
+
|
|
89
|
+
**处理方式:**
|
|
90
|
+
> ⚠️ 检测到 SQL 转换意图,应立即加载 sql-to-dt 子技能。
|
|
91
|
+
> 如果用户说"创建动态表"但未提供 DDL 和 INSERT OVERWRITE,应主动提示:
|
|
92
|
+
> "请提供原始的 CREATE TABLE DDL 和 INSERT OVERWRITE 语句,我可以全自动生成对应的 Dynamic Table DDL 及配套的 refresh、backfill 文件。"
|
|
93
|
+
> 该子技能提供 6 步自动转换工作流:
|
|
94
|
+
> 1. 预处理输入(移除 ALTER、ANALYZE、注释)
|
|
95
|
+
> 2. 占位符替换(转换为 SESSION_CONFIGS)
|
|
96
|
+
> 3. 自引用检测
|
|
97
|
+
> 4. 核心转换(合并 DDL + INSERT 为 CREATE OR REPLACE)
|
|
98
|
+
> 5. 列校验
|
|
99
|
+
> 6. 生成配套文件(refresh、prev_refresh、backfill)
|
|
72
100
|
|
|
73
|
-
|
|
101
|
+
---
|
|
74
102
|
|
|
75
|
-
|
|
103
|
+
## 知识库目录
|
|
76
104
|
|
|
77
|
-
|
|
105
|
+
### dt-creator/ — 创建动态表参考资料
|
|
78
106
|
|
|
79
|
-
|
|
107
|
+
**包含内容:**
|
|
108
|
+
- **dt-declaration-strategy.md** — 静态分区 DT vs 动态分区 DT 的声明策略与选择
|
|
109
|
+
- 静态分区 DT:使用 SESSION_CONFIGS() 传递分区参数,每个分区独立刷新
|
|
110
|
+
- 动态分区 DT:不传递分区参数,一次性处理所有增量数据
|
|
111
|
+
- 决策树:根据数据模式选择合适的分区策略
|
|
80
112
|
|
|
81
|
-
|
|
113
|
+
- **sql-limitations.md** — 增量计算支持的 SQL 模式(JOIN、聚合、窗口函数等的支持情况,以及 VIEW/外部表不支持增量的限制)
|
|
82
114
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
115
|
+
- **incremental-config-reference.md** — 增量刷新配置项完整参考
|
|
116
|
+
- 刷新策略:强制全量、尝试增量并回退
|
|
117
|
+
- 源表特征声明:维度表、仅追加表
|
|
118
|
+
- 全量回退触发条件:基于表变更或变更量
|
|
119
|
+
- 状态表管理:启用/禁用、生命周期、重建、schema 指定
|
|
120
|
+
- DT 定义变更:CREATE OR REPLACE 的兼容性检查
|
|
121
|
+
- Backfill:历史分区数据修正
|
|
122
|
+
- 分区表写入行为:覆盖 vs 追加模式
|
|
86
123
|
|
|
87
|
-
|
|
124
|
+
- **refresh-history-guide.md** — 刷新历史查询的 3 种方式
|
|
125
|
+
- SHOW DYNAMIC TABLE REFRESH HISTORY:作业级信息,含 refresh_mode(INCREMENTAL/FULL/NO_DATA)
|
|
126
|
+
- DESC HISTORY:版本级历史,含行数、字节数、操作类型
|
|
127
|
+
- information_schema.materialized_view_refresh_history:批量分析、监控、CRU 统计
|
|
88
128
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
FROM dwd.fact_orders
|
|
96
|
-
GROUP BY 1, 2;
|
|
129
|
+
**适用问题:**
|
|
130
|
+
- "静态分区 DT 和动态分区 DT 有什么区别? "
|
|
131
|
+
- "动态表支持哪些 SQL 语法?"
|
|
132
|
+
- "增量计算的配置项有哪些?"
|
|
133
|
+
- "怎么查看动态表的刷新历史?"
|
|
134
|
+
- "什么时候会触发全量刷新?"
|
|
97
135
|
|
|
98
|
-
|
|
99
|
-
-- 立即触发首次计算,同时将刷新基准时间重置为当前时刻
|
|
100
|
-
```
|
|
136
|
+
---
|
|
101
137
|
|
|
102
|
-
###
|
|
138
|
+
### dynamic-table-alter/ — 修改动态表操作指南
|
|
103
139
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
140
|
+
**包含内容:**
|
|
141
|
+
- 完整的动态表修改工作流(10 种操作)
|
|
142
|
+
- 5 种直接 ALTER 操作:suspend、resume、set_comment、rename_column、set_column_comment
|
|
143
|
+
- 5 种 CREATE OR REPLACE 操作:add_column、drop_column、alter_column、set_refresh_interval、set_select
|
|
144
|
+
- 平台特有语法和限制说明(CHANGE COLUMN、RENAME COLUMN、DML 限制等)
|
|
145
|
+
- 详细示例和故障排除
|
|
107
146
|
|
|
108
|
-
|
|
109
|
-
-- ALTER DYNAMIC TABLE schema.table_name REFRESH;
|
|
110
|
-
```
|
|
147
|
+
> ⚠️ 此目录对应独立的 **dynamic-table-alter 子技能**。当用户有明确的修改操作意图时,应直接加载该子技能而非本指南。
|
|
111
148
|
|
|
112
|
-
|
|
149
|
+
---
|
|
113
150
|
|
|
114
|
-
|
|
115
|
-
```sql
|
|
116
|
-
ALTER TABLE bronze.raw_orders SET PROPERTIES ('change_tracking' = 'true');
|
|
117
|
-
```
|
|
151
|
+
### sql-to-dt/ — SQL 转 DT 自动转换
|
|
118
152
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
- `INCREMENTAL`:增量刷新(仅处理变更数据,高效)
|
|
123
|
-
- `FULL`:全量刷新(重新计算所有数据)
|
|
124
|
-
- `NO_DATA`:无数据变更,跳过刷新
|
|
125
|
-
|
|
126
|
-
**触发全量刷新的条件**:
|
|
127
|
-
| 条件 | 说明 |
|
|
128
|
-
|---|---|
|
|
129
|
-
| 源表未开启 `change_tracking` | 系统无法识别增量数据 |
|
|
130
|
-
| 查询含不支持增量的算子 | 如某些复杂 JOIN、子查询 |
|
|
131
|
-
| `CREATE OR REPLACE` 修改了计算逻辑 | 如修改 WHERE、GROUP BY、JOIN key |
|
|
132
|
-
| 手动设置强制全量 | `SET cz.optimizer.incremental.force.full.refresh = true` |
|
|
133
|
-
| 维度表变更 | 被 JOIN 的维度表数据变化时,增量结果可能不一致 |
|
|
134
|
-
|
|
135
|
-
**确认是否支持增量刷新**:
|
|
136
|
-
```sql
|
|
137
|
-
SET cz.optimizer.explain.can.incrementalize = true;
|
|
138
|
-
EXPLAIN REFRESH DYNAMIC TABLE my_dt;
|
|
139
|
-
-- 查看 CanBeIncrementalized 字段:Yes = 支持增量,No = 不支持(会给出原因)
|
|
140
|
-
```
|
|
153
|
+
将 Hive/Spark 等任意批处理系统的 CREATE TABLE DDL + INSERT OVERWRITE 全自动转换为 Dynamic Table DDL 及配套文件(refresh、prev_refresh、backfill)。
|
|
154
|
+
|
|
155
|
+
详细转换规则参见 sql-to-dt 子技能。
|
|
141
156
|
|
|
142
157
|
---
|
|
143
158
|
|
|
144
|
-
|
|
145
|
-
|
|
159
|
+
### best-practices/ — 最佳实践与避坑指南
|
|
160
|
+
|
|
161
|
+
**包含内容:**
|
|
162
|
+
|
|
163
|
+
- **performance-optimization.md** — 性能优化策略
|
|
164
|
+
- 核心原则:变更量占比(< 5% 适合增量)、算子类型(INNER JOIN 快于 OUTER JOIN)、数据局部性
|
|
165
|
+
- SQL 优化技巧:优先 INNER JOIN、减少 DISTINCT、窗口函数必须有 PARTITION BY、使用分区条件限制数据范围
|
|
166
|
+
- 管道拆分:将复杂 DT 拆分为多个阶段
|
|
167
|
+
|
|
168
|
+
- **dimension-table-join-guide.md** — 维度表 JOIN 场景详解
|
|
169
|
+
- 核心机制:维度表变更被忽略,仅事实表变更触发增量计算
|
|
170
|
+
- 配置方式:TBLPROPERTIES('mv_const_tables'='dim1,dim2') 或 Session 配置
|
|
171
|
+
- 推荐场景:码表/字典表、T+1 维度 + 实时事实表、大事实 JOIN 小维度
|
|
172
|
+
- 不推荐场景:频繁更新的维度且需要实时一致性
|
|
173
|
+
- 数据修正:维度表变更后必须使用全量刷新
|
|
174
|
+
|
|
175
|
+
- **non-partitioned-merge-into-warning.md** — 非分区 DT + 连续写入风险告警
|
|
176
|
+
- 触发条件:DT 是非分区表 + 源表连续写入 + SQL 含 ROW_NUMBER() 去重
|
|
177
|
+
- 三大风险:存储无限增长、归档引发性能灾难、无法过滤归档删除
|
|
178
|
+
- 推荐替代方案:MERGE INTO + Table Stream(归档免疫、独立生命周期管理)
|
|
179
|
+
|
|
180
|
+
- **scheduling-guide.md** — 调度方式选择指南
|
|
181
|
+
- 两种方式对比:DDL 内置调度(REFRESH INTERVAL)vs Studio Task 调度
|
|
182
|
+
- 有 Studio 时始终推荐 Studio Task:支持上下游依赖、统一告警、可视化监控
|
|
183
|
+
- DDL 内置调度的弊端:无告警、无依赖编排、只能手动 SQL 查询刷新状态
|
|
184
|
+
- Studio Task 配置要点:必须开启自依赖、配置失败/超时告警、按需配置上游依赖
|
|
185
|
+
- 多级 DT 管道的调度编排方式
|
|
186
|
+
|
|
187
|
+
**适用问题:**
|
|
188
|
+
- "动态表性能怎么优化?"
|
|
189
|
+
- "维度表 JOIN 怎么配置?"
|
|
190
|
+
- "非分区动态表有什么风险?"
|
|
191
|
+
- "什么时候不应该用动态表?"
|
|
192
|
+
- "动态表调度用 REFRESH INTERVAL 还是 Studio Task?"
|
|
193
|
+
- "动态表刷新失败怎么收到告警?"
|
|
194
|
+
|
|
195
|
+
---
|
|
146
196
|
|
|
147
|
-
##
|
|
148
|
-
修改 Dynamic Table 的结构和属性(suspend/resume、加列删列、改刷新间隔等)。
|
|
197
|
+
## 路由决策树
|
|
149
198
|
|
|
150
|
-
|
|
151
|
-
|
|
199
|
+
```
|
|
200
|
+
用户提问
|
|
201
|
+
│
|
|
202
|
+
├─ 包含修改操作关键词?
|
|
203
|
+
│ ("修改动态表"、"加列"、"改间隔"、"暂停"、"ALTER DYNAMIC TABLE")
|
|
204
|
+
│ └─ 是 → 立即加载 dynamic-table-alter 子技能
|
|
205
|
+
│
|
|
206
|
+
├─ 包含 SQL 转换关键词?
|
|
207
|
+
│ ("转换DT"、"sql to dt"、"INSERT OVERWRITE转DT"、"DDL转换"、"创建动态表")
|
|
208
|
+
│ └─ 是 → 立即加载 sql-to-dt 子技能
|
|
209
|
+
│
|
|
210
|
+
└─ 通用咨询/学习?
|
|
211
|
+
("动态表怎么用"、"最佳实践"、"性能优化"、"增量配置")
|
|
212
|
+
└─ 是 → 提供本指南的参考文档
|
|
213
|
+
```
|
|
152
214
|
|
|
153
215
|
---
|
|
154
216
|
|
|
155
|
-
##
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
217
|
+
## 使用建议
|
|
218
|
+
|
|
219
|
+
1. **首次学习**:从 dt-creator/ 开始,了解 DT 的声明策略和配置项
|
|
220
|
+
2. **迁移场景**:使用 sql-to-dt 子技能批量转换现有 ETL
|
|
221
|
+
3. **日常运维**:使用 dynamic-table-alter 子技能修改 DT 结构
|
|
222
|
+
4. **性能调优**:参考 best-practices/ 中的优化建议和避坑指南
|
|
223
|
+
5. **调度配置**:有 Studio 时始终使用 Studio Task 调度,参考 best-practices/scheduling-guide.md
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## 相关技能
|
|
228
|
+
|
|
229
|
+
- **dynamic-table-alter** — 修改动态表的操作型子技能(10 种修改操作)
|
|
230
|
+
- **sql-to-dt** — SQL 转 DT 的转换型子技能(6 步自动转换工作流)
|
|
@@ -16,10 +16,7 @@ TBLPROPERTIES('mv_const_tables'='dim_table1,dim_table2')
|
|
|
16
16
|
AS SELECT ...;
|
|
17
17
|
|
|
18
18
|
-- 方式2:Session 配置(在 REFRESH 前设置,灵活可动态调整)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-- 查看已设置的 TBLPROPERTIES(使用 SHOW CREATE TABLE,不支持 SHOW TBLPROPERTIES)
|
|
22
|
-
SHOW CREATE TABLE my_dt;
|
|
19
|
+
set CZ_OPTIMIZER_INCREMENTAL_DIMENSION_TABLES=dim_table1:dim_table2
|
|
23
20
|
```
|
|
24
21
|
|
|
25
22
|
## 各 JOIN 类型下的增量行为
|
|
@@ -154,21 +151,20 @@ LEFT JOIN t3 ON t1.id = t3.id;
|
|
|
154
151
|
|
|
155
152
|
```sql
|
|
156
153
|
-- 强制全量刷新(推荐)
|
|
157
|
-
|
|
154
|
+
set cz.optimizer.incremental.force.full.refresh=true
|
|
158
155
|
REFRESH DYNAMIC TABLE my_dt;
|
|
159
156
|
-- 刷新完成后记得关闭,否则后续每次都是全量
|
|
160
|
-
|
|
157
|
+
set cz.optimizer.incremental.force.full.refresh=false
|
|
161
158
|
|
|
162
|
-
--
|
|
163
|
-
|
|
159
|
+
-- 如果是分区表,也可以只全量刷新指定分区
|
|
160
|
+
set cz.optimizer.incremental.force.full.refresh=true
|
|
161
|
+
set dt.args.ds=2025-01-01
|
|
164
162
|
REFRESH DYNAMIC TABLE my_dt PARTITION(ds = '2025-01-01');
|
|
165
|
-
|
|
163
|
+
set cz.optimizer.incremental.force.full.refresh=false
|
|
166
164
|
```
|
|
167
165
|
|
|
168
166
|
配置说明:
|
|
169
167
|
- `cz.optimizer.incremental.force.full.refresh`:默认 `false`。设为 `true` 后,下一次 REFRESH 会忽略增量逻辑,对所有源表做全量扫描重算
|
|
170
|
-
- `SET cz.optimizer.*` 配置项在交互式 SQL 中可用
|
|
171
|
-
- `dt.args.*` 参数仅在 Studio 任务中可用,不能在交互式 SQL 中 SET
|
|
172
168
|
- 该配置是 session 级别的,刷新完成后需要手动设回 `false`,否则后续所有 REFRESH 都会走全量
|
|
173
169
|
- backfill 模式(`cz.optimizer.incremental.backfill.enabled=TRUE`)也会自动开启全量刷新
|
|
174
170
|
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Dynamic Table 调度方式选择指南
|
|
2
|
+
|
|
3
|
+
## 两种调度方式对比
|
|
4
|
+
|
|
5
|
+
| 方式 | 做法 | 优点 | 缺点 |
|
|
6
|
+
|------|------|------|------|
|
|
7
|
+
| **DDL 内置调度**(REFRESH INTERVAL) | 在 CREATE DYNAMIC TABLE 时写 `REFRESH INTERVAL` 子句,由 Lakehouse 自动触发 | 简单,无需额外配置 | 无告警、无依赖编排、刷新状态只能手动 SQL 查询 |
|
|
8
|
+
| **Studio Task 调度**(推荐) | 在 Studio 创建定时任务,任务内容为 `REFRESH DYNAMIC TABLE` 命令 | 支持上下游依赖、统一告警、可视化监控 | 需要额外创建 Task |
|
|
9
|
+
|
|
10
|
+
**生产环境推荐使用 Studio Task 调度。** DDL 内置调度适合快速验证和开发测试阶段。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## DDL 内置调度
|
|
15
|
+
|
|
16
|
+
在 CREATE 语句中通过 `REFRESH INTERVAL` 子句定义刷新频率,Lakehouse 自动周期性触发:
|
|
17
|
+
|
|
18
|
+
```sql
|
|
19
|
+
CREATE DYNAMIC TABLE sales_daily
|
|
20
|
+
REFRESH INTERVAL 1 DAY
|
|
21
|
+
VCLUSTER default
|
|
22
|
+
AS
|
|
23
|
+
SELECT DATE(created_at) AS dt, SUM(amount) AS total
|
|
24
|
+
FROM orders
|
|
25
|
+
GROUP BY 1;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 弊端
|
|
29
|
+
|
|
30
|
+
- **无告警**:刷新失败不会主动通知,只能手动执行 SQL 查询状态
|
|
31
|
+
- **无依赖编排**:无法声明"等上游任务完成后再刷新",只能靠时间间隔错开
|
|
32
|
+
- **监控成本高**:需要定期手动执行以下命令检查刷新是否正常
|
|
33
|
+
|
|
34
|
+
```sql
|
|
35
|
+
-- 查看刷新历史,确认 state 是否为 SUCCEED
|
|
36
|
+
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'your_dt_name';
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
关键字段说明:
|
|
40
|
+
|
|
41
|
+
| 字段 | 含义 |
|
|
42
|
+
|------|------|
|
|
43
|
+
| `state` | SUCCEED / FAILED / RUNNING / QUEUED |
|
|
44
|
+
| `refresh_mode` | INCREMENTAL / FULL / NO_DATA |
|
|
45
|
+
| `error_message` | 失败时的错误信息 |
|
|
46
|
+
| `duration` | 本次刷新耗时 |
|
|
47
|
+
| `stats` | 增量行数(rows_inserted / rows_deleted) |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Studio Task 调度(生产推荐)
|
|
52
|
+
|
|
53
|
+
在 Studio 中创建 SQL 任务,任务内容为 REFRESH 命令,通过 Studio 的调度系统管理执行。
|
|
54
|
+
|
|
55
|
+
### Task 内容
|
|
56
|
+
|
|
57
|
+
**非分区 DT:**
|
|
58
|
+
|
|
59
|
+
```sql
|
|
60
|
+
REFRESH DYNAMIC TABLE schema_name.dt_name;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**分区 DT(带参数):**
|
|
64
|
+
|
|
65
|
+
```sql
|
|
66
|
+
SET dt.args.ds = '${bizdate}';
|
|
67
|
+
REFRESH DYNAMIC TABLE schema_name.dt_name PARTITION (ds = '${bizdate}');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`${bizdate}` 由 Studio 调度引擎在每次执行时自动替换为业务日期。
|
|
71
|
+
|
|
72
|
+
### 必须配置自依赖
|
|
73
|
+
|
|
74
|
+
同一张 DT 禁止并发 REFRESH(会导致写冲突或数据不一致)。Task 必须开启**自依赖**,确保上一个实例完成后才启动下一个实例。
|
|
75
|
+
|
|
76
|
+
### 上游依赖配置
|
|
77
|
+
|
|
78
|
+
- 如果 DT 的源表数据需要等上游任务产出后才能刷新 → 配置上游依赖
|
|
79
|
+
- 如果源表数据不要求同步就绪(如实时写入表)→ 可以不配置上游依赖
|
|
80
|
+
|
|
81
|
+
### 告警配置
|
|
82
|
+
|
|
83
|
+
Studio Task 支持以下告警规则,生产环境建议全部配置:
|
|
84
|
+
|
|
85
|
+
- **失败告警**:任务执行失败时通知
|
|
86
|
+
- **超时告警**:刷新耗时超过阈值时通知(用于发现性能回退)
|
|
87
|
+
- **未运行告警**:任务在预期时间内未启动时通知
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 多级 DT 管道的调度编排
|
|
92
|
+
|
|
93
|
+
当存在多张 DT 形成上下游依赖时(如 DT_A → DT_B → DT_C),每张 DT 对应一个 Studio Task,通过任务依赖关系保证执行顺序:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Task_A (REFRESH DT_A)
|
|
97
|
+
└─ Task_B (REFRESH DT_B,依赖 Task_A)
|
|
98
|
+
└─ Task_C (REFRESH DT_C,依赖 Task_B)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
不同分区的 REFRESH 可以并行执行(分配到不同 Task 实例),同一分区/非分区 DT 禁止并发。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 判断逻辑:向用户推荐调度方式
|
|
106
|
+
|
|
107
|
+
在帮助用户创建或配置 DT 时,按以下逻辑推荐:
|
|
108
|
+
|
|
109
|
+
1. **是否有 Studio?**
|
|
110
|
+
- 有 → 始终推荐 Studio Task 调度,无论是开发还是生产环境
|
|
111
|
+
- 无 → 使用 DDL 内置调度或第三方调度引擎
|
|
112
|
+
|
|
113
|
+
2. **是否有上下游依赖?**
|
|
114
|
+
- 有(如源表由另一个任务产出)→ 必须用 Studio Task,配置上游依赖
|
|
115
|
+
- 无 → 仍推荐 Studio Task,获得告警能力
|
|
116
|
+
|
|
117
|
+
3. **用户已经写了 REFRESH INTERVAL 子句?**
|
|
118
|
+
- 提示:可以去掉 REFRESH INTERVAL 子句,改用 Studio Task 调度,获得告警和依赖管理能力
|
|
119
|
+
- REFRESH INTERVAL 和 Studio Task 可以共存,但会导致双重触发,建议二选一
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 告警话术模板
|
|
124
|
+
|
|
125
|
+
当用户使用 DDL 内置调度时,使用以下话术提示:
|
|
126
|
+
|
|
127
|
+
> 💡 **建议**:您当前使用的是 DDL 内置调度(REFRESH INTERVAL),这种方式存在以下局限:
|
|
128
|
+
>
|
|
129
|
+
> 1. **无告警**:刷新失败不会主动通知,需要手动执行 `SHOW DYNAMIC TABLE REFRESH HISTORY` 查看状态
|
|
130
|
+
> 2. **无依赖编排**:无法声明上下游任务依赖关系,只能靠时间间隔错开
|
|
131
|
+
>
|
|
132
|
+
> **推荐**:在 Studio 中创建定时调度任务,任务内容为 `REFRESH DYNAMIC TABLE schema.dt_name`,并配置:
|
|
133
|
+
> - 自依赖(防止并发刷新)
|
|
134
|
+
> - 失败告警 + 超时告警
|
|
135
|
+
> - 上游依赖(如果源表由其他任务产出)
|
package/bin/skills/clickzetta-dynamic-table/dt-creator/references/dt-declaration-strategy.md
CHANGED
|
@@ -18,7 +18,8 @@ SELECT id, amount, SESSION_CONFIGS()['dt.args.ds'] AS ds
|
|
|
18
18
|
FROM orders
|
|
19
19
|
WHERE ds = SESSION_CONFIGS()['dt.args.ds'];
|
|
20
20
|
|
|
21
|
-
--
|
|
21
|
+
-- 刷新时指定分区
|
|
22
|
+
set dt.args.ds=2025-01-01
|
|
22
23
|
REFRESH DYNAMIC TABLE order_daily PARTITION(ds = '2025-01-01');
|
|
23
24
|
```
|
|
24
25
|
|
|
@@ -106,22 +107,21 @@ REFRESH DYNAMIC TABLE order_summary;
|
|
|
106
107
|
|
|
107
108
|
### 刷新方式
|
|
108
109
|
|
|
109
|
-
> ⚠️ **重要**:静态分区 DT 的 `dt.args.*` 参数**仅在 Studio 任务中可用**,不能在交互式 SQL 中使用 `SET dt.args.xxx`。
|
|
110
|
-
> 必须通过 Studio 创建调度任务,在任务参数中配置 `dt.args.ds` 等值。
|
|
111
|
-
|
|
112
110
|
```sql
|
|
113
|
-
--
|
|
111
|
+
-- 每次刷新一个分区
|
|
112
|
+
set dt.args.ds=2025-01-15
|
|
114
113
|
REFRESH DYNAMIC TABLE my_dt PARTITION(ds = '2025-01-15');
|
|
115
114
|
|
|
116
115
|
-- 多级分区
|
|
116
|
+
set dt.args.pt=20250411
|
|
117
|
+
set dt.args.pt_hour=01
|
|
117
118
|
REFRESH DYNAMIC TABLE my_dt PARTITION(pt = '20250411', pt_hour = '01');
|
|
118
119
|
```
|
|
119
120
|
|
|
120
121
|
### 注意事项
|
|
121
122
|
|
|
122
|
-
- 回填时使用 `
|
|
123
|
-
- `dt.args
|
|
124
|
-
- `cz.optimizer.*` 配置项在交互式 SQL 中可用
|
|
123
|
+
- 回填时使用 `cz.optimizer.incremental.backfill.enabled=TRUE`,会自动走全量刷新
|
|
124
|
+
- 分区参数通过 `set dt.args.xxx=value` 传入,REFRESH 语句中的 PARTITION 子句指定分区值
|
|
125
125
|
|
|
126
126
|
## 动态分区 DT 详解
|
|
127
127
|
|
package/bin/skills/clickzetta-dynamic-table/dt-creator/references/incremental-config-reference.md
CHANGED
|
@@ -87,9 +87,6 @@ CREATE DYNAMIC TABLE my_dt
|
|
|
87
87
|
TBLPROPERTIES('mv_const_tables' = 'dim_product,dim_region')
|
|
88
88
|
AS SELECT ...;
|
|
89
89
|
|
|
90
|
-
-- 查看已设置的 TBLPROPERTIES(⚠️ 不支持 SHOW TBLPROPERTIES 语法)
|
|
91
|
-
SHOW CREATE TABLE my_dt;
|
|
92
|
-
|
|
93
90
|
-- 或通过 Session 配置(在 REFRESH 语句前执行)
|
|
94
91
|
SET cz.optimizer.incremental.dimension.tables = 'dim_product,dim_region';
|
|
95
92
|
REFRESH DYNAMIC TABLE my_dt;
|
|
@@ -352,8 +349,9 @@ SET cz.sql.mv.check.before.replacing.sql = true;
|
|
|
352
349
|
- 回填通常配合 `INSERT OVERWRITE` 使用,覆盖目标分区的已有数据。
|
|
353
350
|
|
|
354
351
|
```sql
|
|
355
|
-
--
|
|
352
|
+
-- 回填指定历史分区(在 REFRESH 语句前执行)
|
|
356
353
|
SET cz.optimizer.incremental.backfill.enabled = true;
|
|
354
|
+
SET dt.args.ds = '2025-01-01';
|
|
357
355
|
REFRESH DYNAMIC TABLE my_dt PARTITION(ds = '2025-01-01');
|
|
358
356
|
SET cz.optimizer.incremental.backfill.enabled = false;
|
|
359
357
|
|
|
@@ -11,21 +11,16 @@
|
|
|
11
11
|
### 语法
|
|
12
12
|
|
|
13
13
|
```sql
|
|
14
|
-
--
|
|
14
|
+
-- 通过 WHERE 过滤(name 列匹配表名)
|
|
15
15
|
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'my_dt';
|
|
16
16
|
|
|
17
|
-
--
|
|
18
|
-
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'my_dt' LIMIT 10;
|
|
19
|
-
|
|
20
|
-
-- 组合 WHERE + LIMIT + 状态过滤
|
|
17
|
+
-- 组合 WHERE + LIMIT
|
|
21
18
|
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'my_dt' AND state = 'SUCCEED' LIMIT 20;
|
|
22
19
|
|
|
23
20
|
-- MV 也支持同样的语法
|
|
24
21
|
SHOW MATERIALIZED VIEW REFRESH HISTORY WHERE name = 'my_mv' LIMIT 10;
|
|
25
22
|
```
|
|
26
23
|
|
|
27
|
-
> ⚠️ 注意:`FOR <table_name>` 语法在当前版本中可能返回空结果,请使用 `WHERE name = '<table_name>'` 语法。
|
|
28
|
-
|
|
29
24
|
### 输出列
|
|
30
25
|
|
|
31
26
|
| 列名 | 类型 | 说明 |
|
|
@@ -80,9 +75,6 @@ SHOW MATERIALIZED VIEW REFRESH HISTORY WHERE name = 'my_mv' LIMIT 10;
|
|
|
80
75
|
### 典型用法
|
|
81
76
|
|
|
82
77
|
```sql
|
|
83
|
-
-- 查看最近 5 次刷新是否成功
|
|
84
|
-
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'my_dt' LIMIT 5;
|
|
85
|
-
|
|
86
78
|
-- 查看失败的刷新记录
|
|
87
79
|
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'my_dt' AND state = 'FAILED';
|
|
88
80
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sql-to-dt
|
|
3
|
+
description: 将 Hive/Spark 等任意批处理系统的 CREATE TABLE DDL + INSERT OVERWRITE SQL 自动转换为 Dynamic Table DDL 及配套文件(refresh、prev_refresh、backfill)。当用户提供 DDL 和 INSERT OVERWRITE 要求转换为 DT 时触发,或用户说"创建动态表"时主动引导提供输入。Triggers on: "转换DT", "sql to dt", "convert to dynamic table", "INSERT OVERWRITE 转 DT", "DDL 转换", "创建动态表"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SQL → Dynamic Table 自动转换
|
|
7
|
+
|
|
8
|
+
将 Hive/Spark 等任意批处理系统的 ETL SQL(CREATE TABLE + INSERT OVERWRITE)转换为 Dynamic Table DDL 及配套运维文件。
|
|
9
|
+
|
|
10
|
+
## 使用方式
|
|
11
|
+
|
|
12
|
+
提供以下输入:
|
|
13
|
+
1. CREATE TABLE DDL(表结构定义)
|
|
14
|
+
2. INSERT OVERWRITE SQL(ETL 查询逻辑)
|
|
15
|
+
|
|
16
|
+
转换工具会自动完成:占位符替换、自引用检测、核心转换、列校验、配套文件生成、转换后改进建议。
|
|
17
|
+
|
|
18
|
+
详细工作流参见 #[[file:references/sql2dt-workflow.md]]
|
|
19
|
+
|
|
20
|
+
## references/
|
|
21
|
+
|
|
22
|
+
- **sql2dt-workflow.md** — 完整转换工作流(6 步:预处理、占位符替换、自引用检测、核心转换、列校验、配套文件生成)
|
|
23
|
+
- **sql2dt-conversion-rules.md** — 核心 DDL 转换规则(解析 DDL、解析 INSERT、组装 DT DDL、静态分区注入)
|
|
24
|
+
- **sql2dt-placeholder-rules.md** — 占位符替换规则(${var} → SESSION_CONFIGS())
|
|
25
|
+
- **sql2dt-self-reference-rules.md** — 自引用表转换规则
|
|
26
|
+
- **sql2dt-column-validation-rules.md** — 列校验规则(schema 列数 = SELECT 列数)
|
|
27
|
+
- **sql2dt-refresh-rules.md** — Refresh 与调度文件生成规则
|