@clickzetta/cz-cli-darwin-x64 0.3.17 → 0.3.19
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-access-control/SKILL.md +243 -0
- package/bin/skills/clickzetta-access-control/eval_cases.jsonl +3 -0
- package/bin/skills/clickzetta-access-control/references/dynamic-masking.md +86 -0
- package/bin/skills/clickzetta-access-control/references/grant-revoke.md +103 -0
- package/bin/skills/clickzetta-access-control/references/role-management.md +66 -0
- package/bin/skills/clickzetta-access-control/references/user-management.md +61 -0
- package/bin/skills/clickzetta-ai-vector-search/SKILL.md +160 -0
- package/bin/skills/clickzetta-ai-vector-search/eval_cases.jsonl +4 -0
- package/bin/skills/clickzetta-ai-vector-search/references/vector-search.md +155 -0
- package/bin/skills/clickzetta-batch-sync-pipeline/SKILL.md +386 -0
- package/bin/skills/clickzetta-cdc-sync-pipeline/SKILL.md +548 -0
- package/bin/skills/clickzetta-data-ingest-pipeline/SKILL.md +220 -0
- package/bin/skills/clickzetta-data-ingest-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-data-retention/SKILL.md +160 -0
- package/bin/skills/clickzetta-data-retention/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-data-retention/references/lifecycle-reference.md +175 -0
- package/bin/skills/clickzetta-dw-modeling/SKILL.md +259 -0
- package/bin/skills/clickzetta-dw-modeling/eval_cases.jsonl +4 -0
- package/bin/skills/clickzetta-dw-modeling/references/modeling-patterns.md +100 -0
- package/bin/skills/clickzetta-dynamic-table/SKILL.md +112 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/dimension-table-join-guide.md +257 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/medallion-and-stream-patterns.md +124 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/non-partitioned-merge-into-warning.md +96 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/performance-optimization.md +109 -0
- package/bin/skills/clickzetta-external-function/SKILL.md +203 -0
- package/bin/skills/clickzetta-external-function/eval_cases.jsonl +4 -0
- package/bin/skills/clickzetta-external-function/references/external-function-ddl.md +171 -0
- package/bin/skills/clickzetta-file-import-pipeline/SKILL.md +156 -0
- package/bin/skills/clickzetta-index-manager/SKILL.md +140 -0
- package/bin/skills/clickzetta-index-manager/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-index-manager/references/bloomfilter-index.md +67 -0
- package/bin/skills/clickzetta-index-manager/references/index-management.md +73 -0
- package/bin/skills/clickzetta-index-manager/references/inverted-index.md +80 -0
- package/bin/skills/clickzetta-index-manager/references/vector-index.md +81 -0
- package/bin/skills/clickzetta-kafka-ingest-pipeline/SKILL.md +751 -0
- package/bin/skills/clickzetta-kafka-ingest-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-kafka-ingest-pipeline/references/kafka-pipe-syntax.md +324 -0
- package/bin/skills/clickzetta-monitoring/SKILL.md +199 -0
- package/bin/skills/clickzetta-monitoring/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-monitoring/references/job-history-analysis.md +97 -0
- package/bin/skills/clickzetta-monitoring/references/show-jobs.md +48 -0
- package/bin/skills/clickzetta-oss-ingest-pipeline/SKILL.md +537 -0
- package/bin/skills/clickzetta-query-optimizer/SKILL.md +156 -0
- package/bin/skills/clickzetta-query-optimizer/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-query-optimizer/references/explain.md +56 -0
- package/bin/skills/clickzetta-query-optimizer/references/hints-and-sortkey.md +78 -0
- package/bin/skills/clickzetta-query-optimizer/references/optimize.md +65 -0
- package/bin/skills/clickzetta-query-optimizer/references/result-cache.md +49 -0
- package/bin/skills/clickzetta-query-optimizer/references/show-jobs.md +42 -0
- package/bin/skills/clickzetta-realtime-sync-pipeline/SKILL.md +276 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/SKILL.md +379 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/evals/evals.json +166 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/dynamic-table.md +185 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/materialized-view.md +129 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/pipe.md +222 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/table-stream.md +125 -0
- package/bin/skills/clickzetta-table-stream-pipeline/SKILL.md +206 -0
- package/bin/skills/clickzetta-vcluster-manager/SKILL.md +212 -0
- package/bin/skills/clickzetta-vcluster-manager/references/vc-cache.md +54 -0
- package/bin/skills/clickzetta-vcluster-manager/references/vcluster-ddl.md +150 -0
- package/bin/skills/clickzetta-volume-manager/SKILL.md +292 -0
- package/bin/skills/clickzetta-volume-manager/references/volume-ddl.md +199 -0
- package/bin/skills/cz-cli/SKILL.md +1 -1
- package/bin/skills/cz-cli-inner/SKILL.md +8 -0
- package/package.json +1 -1
- /package/bin/skills/{dt-creator → clickzetta-dynamic-table/dt-creator}/SKILL.md +0 -0
- /package/bin/skills/{dt-creator → clickzetta-dynamic-table/dt-creator}/references/dt-declaration-strategy.md +0 -0
- /package/bin/skills/{dt-creator → clickzetta-dynamic-table/dt-creator}/references/incremental-config-reference.md +0 -0
- /package/bin/skills/{dt-creator → clickzetta-dynamic-table/dt-creator}/references/refresh-history-guide.md +0 -0
- /package/bin/skills/{dt-creator → clickzetta-dynamic-table/dt-creator}/references/sql-limitations.md +0 -0
- /package/bin/skills/{dynamic-table-alter → clickzetta-dynamic-table/dynamic-table-alter}/SKILL.md +0 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clickzetta-dw-modeling
|
|
3
|
+
description: |
|
|
4
|
+
ClickZetta Lakehouse 数仓建模向导。先自主探索用户的数据现状,再给出有依据的
|
|
5
|
+
具体建议让用户选择,而不是让用户填空回答问卷。
|
|
6
|
+
覆盖三种分层模式:传统数仓分层(ODS/DWD/DWS/ADS)、大奖牌架构(Bronze/Silver/Gold)、
|
|
7
|
+
混合模式。数据管道与建模一体化设计,DDL 和管道配置同步输出。
|
|
8
|
+
核心原则:聚合计算层使用 Dynamic Table,不推荐物化视图。
|
|
9
|
+
当用户说"数仓建模"、"分层设计"、"建模方案"、"ODS/DWD/DWS"、"Medallion"、
|
|
10
|
+
"Bronze/Silver/Gold"、"事实表"、"维度表"、"宽表设计"、"星型模型"、"雪花模型"、
|
|
11
|
+
"分层架构"、"数据分层"、"建模向导"、"怎么设计表结构"、"数仓架构"、
|
|
12
|
+
"数据管道设计"、"数据流转"、"端到端数仓搭建"时触发。
|
|
13
|
+
Keywords: data warehouse, modeling, star schema, medallion, ODS, DWD, DWS, ADS, layering
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# ClickZetta 数仓建模向导
|
|
17
|
+
|
|
18
|
+
阅读 [references/modeling-patterns.md](references/modeling-patterns.md) 了解各分层模式的详细模板。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 工作模式:先探索,再建议
|
|
23
|
+
|
|
24
|
+
**不要问问卷式问题。先动手看数据,再给出有依据的选择题。**
|
|
25
|
+
|
|
26
|
+
用户最多只需要回答 2 个问题:
|
|
27
|
+
1. 选择给出的方案选项(A/B/C)
|
|
28
|
+
2. 补充看不到的信息(业务用途、查询场景)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 第一阶段:自主探索数据现状
|
|
33
|
+
|
|
34
|
+
收到建模需求后,立即执行以下探索,**不要先问用户任何问题**:
|
|
35
|
+
|
|
36
|
+
```sql
|
|
37
|
+
-- Step 1: 看有哪些 schema
|
|
38
|
+
SHOW SCHEMAS;
|
|
39
|
+
|
|
40
|
+
-- Step 2: 看各 schema 下的表(对每个看起来有业务数据的 schema 执行)
|
|
41
|
+
SHOW TABLES IN <schema>;
|
|
42
|
+
|
|
43
|
+
-- Step 3: 查表大小和行数(先 describe_table 确认字段名)
|
|
44
|
+
SELECT table_schema, table_name, table_type,
|
|
45
|
+
ROUND(bytes/1024.0/1024/1024, 2) AS size_gb,
|
|
46
|
+
row_count,
|
|
47
|
+
last_modify_time
|
|
48
|
+
FROM information_schema.tables
|
|
49
|
+
WHERE table_type = 'MANAGED_TABLE'
|
|
50
|
+
ORDER BY bytes DESC NULLS LAST
|
|
51
|
+
LIMIT 20;
|
|
52
|
+
|
|
53
|
+
-- Step 4: 对最大的 2-3 张表抽样,了解字段和数据特征
|
|
54
|
+
SELECT * FROM <schema>.<table> LIMIT 5;
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**探索时的判断逻辑:**
|
|
58
|
+
|
|
59
|
+
| 观察到的特征 | 推断 |
|
|
60
|
+
|---|---|
|
|
61
|
+
| 表名含 order/user/product/trade | 业务库原始数据,适合做 ODS/Bronze |
|
|
62
|
+
| 表名含 log/event/track/click | 埋点/日志数据,数据量大,需要分区 |
|
|
63
|
+
| 表名含 dw/ods/dwd/dws/ads | 已有分层,评估现有结构是否合理 |
|
|
64
|
+
| 表名含 tmp/temp/bak | 临时表,不纳入建模范围 |
|
|
65
|
+
| 字段含 _op/_ts/binlog | CDC 同步过来的数据 |
|
|
66
|
+
| 字段含 event_time/log_time | 时序数据,按时间分区 |
|
|
67
|
+
| 单表 > 10GB | 需要分区+分桶 |
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 第二阶段:给出有依据的建议
|
|
72
|
+
|
|
73
|
+
基于探索结果,向用户呈现三部分内容:
|
|
74
|
+
|
|
75
|
+
### 1. 数据现状摘要(自主总结,不问用户)
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
我看了一下你的数据:
|
|
79
|
+
- `raw` schema:orders(2.3GB/1200万行)、users(450MB)、products(120MB)
|
|
80
|
+
→ 字段特征像是从 MySQL 同步的业务库,orders 有 _op/_ts 字段(CDC 接入)
|
|
81
|
+
- `events` schema:user_events(18GB/8亿行)
|
|
82
|
+
→ 字段含 event_time、event_type,是埋点日志数据
|
|
83
|
+
- 没有发现已有的分层结构
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. 方案选项(给 A/B 或 A/B/C,不超过 3 个)
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
基于以上数据,建议两个方向:
|
|
90
|
+
|
|
91
|
+
A. 传统数仓分层
|
|
92
|
+
raw → ODS(现有数据直接复用)
|
|
93
|
+
新建 DWD(清洗标准化)+ DWS(聚合,用 Dynamic Table)+ ADS(指标输出)
|
|
94
|
+
适合:BI 报表为主,有明确的指标体系需求
|
|
95
|
+
|
|
96
|
+
B. 大奖牌架构(Medallion)
|
|
97
|
+
raw → Bronze(现有数据直接复用)
|
|
98
|
+
新建 Silver(标准化)+ Gold(指标,用 Dynamic Table)
|
|
99
|
+
适合:多场景复用,既做 BI 又做数据科学
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 3. 只问一个问题
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
你们主要用这些数据做什么?
|
|
106
|
+
- BI 报表(固定报表,指标体系明确)→ 推荐 A
|
|
107
|
+
- 多场景(报表+分析+数据科学)→ 推荐 B
|
|
108
|
+
- 实时看板(分钟级延迟)→ 告诉我,方案会有调整
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 第三阶段:方案确认后的完整输出
|
|
114
|
+
|
|
115
|
+
用户选择方向后,**一次性给出完整方案**,不再追问:
|
|
116
|
+
|
|
117
|
+
### 分层结构设计
|
|
118
|
+
|
|
119
|
+
根据选择的模式,给出各层定义、表类型推荐:
|
|
120
|
+
|
|
121
|
+
**传统分层表类型:**
|
|
122
|
+
|
|
123
|
+
| 层次 | 推荐表类型 | 说明 |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| ODS | 内部表 | 贴源,不转换 |
|
|
126
|
+
| DWD | 内部表 | 清洗标准化 |
|
|
127
|
+
| DWS | **Dynamic Table** | 增量聚合,自动刷新 |
|
|
128
|
+
| ADS | **Dynamic Table** | 面向应用,按需刷新 |
|
|
129
|
+
|
|
130
|
+
**Medallion 表类型:**
|
|
131
|
+
|
|
132
|
+
| 层次 | 推荐表类型 | 说明 |
|
|
133
|
+
|---|---|---|
|
|
134
|
+
| Bronze | 内部表 | 零转换,保留原始 |
|
|
135
|
+
| Silver | 内部表 或 Dynamic Table | 清洗标准化 |
|
|
136
|
+
| Gold | **Dynamic Table** | 聚合指标,自动刷新 |
|
|
137
|
+
|
|
138
|
+
> ⚠️ 聚合层**不推荐物化视图**,使用 Dynamic Table:CBO 增量计算,只刷新变化分区,支持 Time Travel。
|
|
139
|
+
|
|
140
|
+
### 数据接入管道
|
|
141
|
+
|
|
142
|
+
根据探索到的数据源特征,直接给出管道推荐(不再问用户):
|
|
143
|
+
|
|
144
|
+
| 数据源特征 | 推荐管道 | 对应 skill |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| 有 _op/_ts 字段(CDC) | CDC 同步 | `clickzetta-cdc-sync-pipeline` |
|
|
147
|
+
| Kafka 消息数据 | Kafka Pipe | `clickzetta-kafka-ingest-pipeline` |
|
|
148
|
+
| OSS/S3 文件 | OSS Pipe | `clickzetta-oss-ingest-pipeline` |
|
|
149
|
+
| 普通数据库表(无 CDC 标记) | 批量同步 | `clickzetta-batch-sync-pipeline` |
|
|
150
|
+
|
|
151
|
+
**ODS/Bronze 层表结构调整(根据管道类型):**
|
|
152
|
+
- CDC 接入 → 保留 `_op`(I/U/D)和 `_ts` 字段,不要删除
|
|
153
|
+
- 批量接入 → 增加 `dw_batch_date` 标记批次
|
|
154
|
+
- Kafka 接入 → JSON 消息用 `STRING` 或 `MAP<STRING,STRING>` 存储
|
|
155
|
+
|
|
156
|
+
### 分区与分桶策略
|
|
157
|
+
|
|
158
|
+
根据探索到的表大小自动推荐:
|
|
159
|
+
|
|
160
|
+
```sql
|
|
161
|
+
-- 单表 < 1GB:不分区
|
|
162
|
+
-- 单表 1GB-100GB:按天分区
|
|
163
|
+
PARTITIONED BY (days(event_date))
|
|
164
|
+
|
|
165
|
+
-- 单表 > 100GB:按天分区 + 分桶
|
|
166
|
+
PARTITIONED BY (days(event_date))
|
|
167
|
+
CLUSTERED BY (user_id) INTO 32 BUCKETS
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
注意:ClickZetta 分区用 `PARTITIONED BY (days(col))`,不是 `PARTITIONED BY (col)`。
|
|
171
|
+
|
|
172
|
+
### 层间流转
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
ODS/Bronze → DWD/Silver:SQL 任务(Studio 调度,清洗逻辑需手动控制)
|
|
176
|
+
DWD/Silver → DWS/Gold:Dynamic Table(TARGET_LAG 控制延迟,自动增量)
|
|
177
|
+
DWS → ADS:Dynamic Table 或直接查询
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
加载 `clickzetta-sql-pipeline-manager` 获取 Dynamic Table 详细语法。
|
|
181
|
+
|
|
182
|
+
### 数据质量卡点
|
|
183
|
+
|
|
184
|
+
| 层次 | 检查重点 | 时机 |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| ODS/Bronze | NULL 比例、CDC _op 分布 | 入库后 |
|
|
187
|
+
| DWD/Silver | 唯一性、关联完整性(LEFT JOIN 验证匹配率) | ETL 后 |
|
|
188
|
+
| DWS/Gold/ADS | 指标环比异常、汇总一致性 | Dynamic Table 刷新后 |
|
|
189
|
+
|
|
190
|
+
### 调度 DAG
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
日批场景:
|
|
194
|
+
数据同步(ODS 接入)→ DWD 清洗任务 → 数据质量检查
|
|
195
|
+
↓
|
|
196
|
+
DWS/Gold(Dynamic Table 自动刷新,无需调度)
|
|
197
|
+
|
|
198
|
+
实时场景:
|
|
199
|
+
CDC/Kafka 持续写入 Bronze → Silver(TARGET_LAG='10min')→ Gold(TARGET_LAG='1h')
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### DDL 模板
|
|
203
|
+
|
|
204
|
+
加载 `clickzetta-sql-syntax-guide` 确认语法,生成各层 DDL:
|
|
205
|
+
|
|
206
|
+
```sql
|
|
207
|
+
-- ODS/Bronze(以 CDC 接入为例)
|
|
208
|
+
CREATE TABLE IF NOT EXISTS ods.orders (
|
|
209
|
+
order_id BIGINT,
|
|
210
|
+
user_id BIGINT,
|
|
211
|
+
amount DECIMAL(18, 2),
|
|
212
|
+
status STRING,
|
|
213
|
+
created_at TIMESTAMP,
|
|
214
|
+
_op STRING, -- CDC 操作类型:I/U/D
|
|
215
|
+
_ts TIMESTAMP, -- 变更时间
|
|
216
|
+
dw_insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
217
|
+
)
|
|
218
|
+
PARTITIONED BY (days(created_at))
|
|
219
|
+
COMMENT 'ODS 订单原始表,贴源不转换';
|
|
220
|
+
|
|
221
|
+
-- DWD/Silver
|
|
222
|
+
CREATE TABLE IF NOT EXISTS dwd.fact_orders (
|
|
223
|
+
order_id BIGINT,
|
|
224
|
+
user_id BIGINT,
|
|
225
|
+
amount DECIMAL(18, 2),
|
|
226
|
+
status_code INT,
|
|
227
|
+
order_date DATE,
|
|
228
|
+
dw_insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
229
|
+
)
|
|
230
|
+
PARTITIONED BY (days(order_date))
|
|
231
|
+
CLUSTERED BY (user_id) INTO 32 BUCKETS
|
|
232
|
+
COMMENT 'DWD 订单事实表,清洗标准化';
|
|
233
|
+
|
|
234
|
+
-- DWS/Gold(Dynamic Table,不用物化视图)
|
|
235
|
+
CREATE DYNAMIC TABLE IF NOT EXISTS dws.user_order_daily
|
|
236
|
+
REFRESH interval 1 HOUR
|
|
237
|
+
VCLUSTER default_ap
|
|
238
|
+
AS
|
|
239
|
+
SELECT
|
|
240
|
+
user_id,
|
|
241
|
+
order_date,
|
|
242
|
+
COUNT(order_id) AS order_cnt,
|
|
243
|
+
SUM(amount) AS total_amount,
|
|
244
|
+
AVG(amount) AS avg_amount
|
|
245
|
+
FROM dwd.fact_orders
|
|
246
|
+
WHERE status_code = 1
|
|
247
|
+
GROUP BY user_id, order_date;
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 核心原则
|
|
253
|
+
|
|
254
|
+
1. **先探索数据,再给建议**——不问问卷,看完数据再说
|
|
255
|
+
2. **给选择题,不给填空题**——用户选 A/B,不要让用户凭空描述
|
|
256
|
+
3. **聚合层用 Dynamic Table,不用物化视图**
|
|
257
|
+
4. **建模和管道一体**——DDL 和管道配置同步输出
|
|
258
|
+
5. **分区用转换函数**:`days(col)` 不是 `col`
|
|
259
|
+
6. **ODS/Bronze 零转换**,保留原始数据方便回溯
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{"case_id":"001","type":"should_call","user_input":"帮我做数仓分层设计","expected_skill":"clickzetta-dw-modeling","expected_output_contains":["分层"]}
|
|
2
|
+
{"case_id":"002","type":"should_call","user_input":"ODS/DWD/DWS/ADS 分层怎么设计","expected_skill":"clickzetta-dw-modeling","expected_output_contains":["ODS","DWD","DWS"]}
|
|
3
|
+
{"case_id":"003","type":"should_call","user_input":"Medallion 架构 Bronze/Silver/Gold 怎么搭建","expected_skill":"clickzetta-dw-modeling","expected_output_contains":["Bronze","Silver","Gold"]}
|
|
4
|
+
{"case_id":"004","type":"should_call","user_input":"星型模型和雪花模型怎么选","expected_skill":"clickzetta-dw-modeling","expected_output_contains":["星型","雪花"]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 数仓建模模式参考
|
|
2
|
+
|
|
3
|
+
## 传统数仓分层详细说明
|
|
4
|
+
|
|
5
|
+
### 分层职责
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
ODS(Operational Data Store)
|
|
9
|
+
├── 贴源存储,不做业务转换
|
|
10
|
+
├── 保留原始字段名和类型
|
|
11
|
+
├── 增加 dw_insert_time、dw_source 等元数据字段
|
|
12
|
+
└── 按时间分区,支持增量同步
|
|
13
|
+
|
|
14
|
+
DWD(Data Warehouse Detail)
|
|
15
|
+
├── 数据清洗:去重、NULL 处理、格式标准化
|
|
16
|
+
├── 维度退化:将常用维度字段冗余到事实表
|
|
17
|
+
├── 业务规则:状态码映射、金额单位统一
|
|
18
|
+
└── 建立主键约束(逻辑主键,ClickZetta 不强制)
|
|
19
|
+
|
|
20
|
+
DWS(Data Warehouse Summary)
|
|
21
|
+
├── 轻度聚合:按天/周/月汇总
|
|
22
|
+
├── 使用 Dynamic Table 自动增量刷新
|
|
23
|
+
├── 面向主题域:用户域、商品域、交易域
|
|
24
|
+
└── 不直接对外提供查询(由 ADS 层封装)
|
|
25
|
+
|
|
26
|
+
ADS(Application Data Store)
|
|
27
|
+
├── 面向具体应用/报表的宽表
|
|
28
|
+
├── 使用 Dynamic Table 或直接查询 DWS
|
|
29
|
+
└── 字段命名业务友好
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 命名规范建议
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Schema 命名:ods_<业务域> / dwd_<业务域> / dws / ads
|
|
36
|
+
表命名:
|
|
37
|
+
ODS:ods_<源系统>_<表名>(如 ods_mysql_orders)
|
|
38
|
+
DWD:dwd_<主题>_<粒度>(如 dwd_trade_order_detail)
|
|
39
|
+
DWS:dws_<主题>_<维度>_<周期>(如 dws_user_order_1d)
|
|
40
|
+
ADS:ads_<应用>_<指标>(如 ads_report_gmv_daily)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 大奖牌架构(Medallion)详细说明
|
|
46
|
+
|
|
47
|
+
### 分层职责
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Bronze(铜牌层)
|
|
51
|
+
├── 原始数据,零转换原则
|
|
52
|
+
├── 支持多种格式:结构化/半结构化/非结构化
|
|
53
|
+
├── 保留所有历史版本(Time Travel)
|
|
54
|
+
└── 数据来源标记(source_system、ingestion_time)
|
|
55
|
+
|
|
56
|
+
Silver(银牌层)
|
|
57
|
+
├── 可信数据:去重、清洗、标准化
|
|
58
|
+
├── 跨源整合:统一字段命名和类型
|
|
59
|
+
├── 业务实体识别:用户、订单、商品
|
|
60
|
+
└── 可直接用于数据科学和探索性分析
|
|
61
|
+
|
|
62
|
+
Gold(金牌层)
|
|
63
|
+
├── 业务就绪数据:聚合指标、宽表
|
|
64
|
+
├── 使用 Dynamic Table 自动刷新
|
|
65
|
+
├── 面向 BI 工具和应用系统
|
|
66
|
+
└── 语义清晰,字段命名业务友好
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Schema 命名建议
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
bronze.<source>_<entity> -- 如 bronze.mysql_orders
|
|
73
|
+
silver.<entity> -- 如 silver.orders
|
|
74
|
+
gold.<domain>_<metric> -- 如 gold.trade_gmv_daily
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Dynamic Table vs 物化视图对比
|
|
80
|
+
|
|
81
|
+
| 特性 | Dynamic Table | 物化视图 |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| 刷新机制 | CBO 增量计算,只刷新变化分区 | 全量或手动增量 |
|
|
84
|
+
| 调度方式 | TARGET_LAG 自动控制 | 需手动配置调度 |
|
|
85
|
+
| Time Travel | ✅ 支持 | ❌ 不支持 |
|
|
86
|
+
| 数据恢复 | ✅ RESTORE TABLE | ❌ 不支持 |
|
|
87
|
+
| 语法复杂度 | 简单,类似 CREATE TABLE | 较复杂 |
|
|
88
|
+
| 推荐场景 | **新项目首选** | 遗留项目兼容 |
|
|
89
|
+
|
|
90
|
+
**结论:新建项目一律使用 Dynamic Table,不使用物化视图。**
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 常见建模陷阱
|
|
95
|
+
|
|
96
|
+
1. **过度规范化**:DWD 层不要拆太细,适当冗余维度字段,减少下游 JOIN
|
|
97
|
+
2. **分区粒度过细**:按小时分区会产生大量小文件,日批场景用按天分区
|
|
98
|
+
3. **ADS 层直接写 SQL**:ADS 层应该用 Dynamic Table,不要让 BI 工具直接跑复杂 SQL
|
|
99
|
+
4. **忽略数据质量**:ODS 层入库时就应该检查 NULL 比例,不要等到 DWS 层才发现问题
|
|
100
|
+
5. **Bronze 层做转换**:Bronze 层一旦做了转换,原始数据就丢失了,回溯困难
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clickzetta-dynamic-table
|
|
3
|
+
description: |
|
|
4
|
+
ClickZetta Dynamic Table(动态表)使用指南,覆盖动态表的创建、修改、增量计算配置和性能优化。
|
|
5
|
+
包含 DT 声明策略(静态分区 DT vs 动态分区 DT)、SQL 支持矩阵、增量配置参考、刷新历史查询、
|
|
6
|
+
ALTER 操作指南,以及维度表 JOIN、性能优化、非分区表风险等最佳实践。
|
|
7
|
+
当用户说"Dynamic Table"、"动态表"、"自动刷新"、"增量刷新"、"物化视图"、
|
|
8
|
+
"REFRESH interval"、"CREATE DYNAMIC TABLE"、
|
|
9
|
+
"数据管道自动化"、"增量计算"、"自动物化"、"定时刷新"、
|
|
10
|
+
"依赖刷新"、"SESSION_CONFIGS"、"静态分区DT"、"动态分区DT"、
|
|
11
|
+
"状态表"、"state table"、"MERGE INTO"、"Table Stream"时触发。
|
|
12
|
+
Keywords: dynamic table, incremental refresh, REFRESH interval, materialized, auto-refresh pipeline, SESSION_CONFIGS, partitioned DT, state table, MERGE INTO
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Dynamic Table 使用指南 — 目录索引
|
|
16
|
+
|
|
17
|
+
## 快速入门
|
|
18
|
+
|
|
19
|
+
```sql
|
|
20
|
+
-- 1. 创建 Dynamic Table(自动调度刷新)
|
|
21
|
+
CREATE DYNAMIC TABLE IF NOT EXISTS silver.orders_daily
|
|
22
|
+
REFRESH INTERVAL 60 MINUTE vcluster default
|
|
23
|
+
AS
|
|
24
|
+
SELECT DATE(created_at) AS order_date, region, SUM(amount) AS total_amount
|
|
25
|
+
FROM bronze.raw_orders
|
|
26
|
+
GROUP BY 1, 2;
|
|
27
|
+
|
|
28
|
+
-- 2. 查看状态与刷新历史
|
|
29
|
+
DESC DYNAMIC TABLE silver.orders_daily;
|
|
30
|
+
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'orders_daily' LIMIT 10;
|
|
31
|
+
|
|
32
|
+
-- 3. 手动触发刷新
|
|
33
|
+
REFRESH DYNAMIC TABLE silver.orders_daily;
|
|
34
|
+
|
|
35
|
+
-- 4. 列出所有 Dynamic Table
|
|
36
|
+
SHOW TABLES IN silver WHERE is_dynamic;
|
|
37
|
+
-- 返回列:schema_name, table_name, is_view, is_materialized_view, is_external, is_dynamic
|
|
38
|
+
-- ⚠️ 列名是 table_name(不是 name),过滤用 WHERE table_name = 'xxx'
|
|
39
|
+
|
|
40
|
+
-- 5. 查看指定表是否为动态表
|
|
41
|
+
SHOW TABLES IN silver WHERE table_name = 'orders_daily';
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 调度方式
|
|
45
|
+
|
|
46
|
+
| 方式 | 语法 | 适用场景 |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| 自动调度 | `REFRESH INTERVAL 10 MINUTE vcluster <name>` | 系统按间隔自动刷新(推荐) |
|
|
49
|
+
| 指定开始时间 | `REFRESH START WITH TIMESTAMP '2025-01-01 00:00:00' INTERVAL 1 HOUR vcluster <name>` | 从指定时间开始调度 |
|
|
50
|
+
| 手动触发 | `REFRESH DYNAMIC TABLE my_dt;` | 外部调度器触发,适合静态分区 DT |
|
|
51
|
+
|
|
52
|
+
INTERVAL 支持的单位:`SECOND`、`MINUTE`、`HOUR`、`DAY`,最小值为 1 分钟。
|
|
53
|
+
|
|
54
|
+
> 建议使用 GP 型集群刷新动态表。动态表刷新过程中会自动执行小文件合并,AP 型集群不支持此功能。
|
|
55
|
+
> ⚠️ **VCluster 类型限制**:创建动态表时如果指定了 AP 型集群(如 `default_ap`),刷新仍可执行但不会进行小文件合并,长期运行可能导致查询性能下降。建议始终使用 GP 型集群(如 `default`)。
|
|
56
|
+
|
|
57
|
+
### 开启增量刷新的前提
|
|
58
|
+
|
|
59
|
+
源表需开启变更跟踪:
|
|
60
|
+
```sql
|
|
61
|
+
ALTER TABLE bronze.raw_orders SET PROPERTIES ('change_tracking' = 'true');
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 增量刷新 vs 全量刷新
|
|
65
|
+
|
|
66
|
+
通过 `SHOW DYNAMIC TABLE REFRESH HISTORY` 的 `refresh_mode` 字段可查看刷新模式:
|
|
67
|
+
- `INCREMENTAL`:增量刷新(仅处理变更数据,高效)
|
|
68
|
+
- `FULL`:全量刷新(重新计算所有数据)
|
|
69
|
+
- `NO_DATA`:无数据变更,跳过刷新
|
|
70
|
+
|
|
71
|
+
**触发全量刷新的条件**:
|
|
72
|
+
| 条件 | 说明 |
|
|
73
|
+
|---|---|
|
|
74
|
+
| 源表未开启 `change_tracking` | 系统无法识别增量数据 |
|
|
75
|
+
| 查询含不支持增量的算子 | 如某些复杂 JOIN、子查询 |
|
|
76
|
+
| `CREATE OR REPLACE` 修改了计算逻辑 | 如修改 WHERE、GROUP BY、JOIN key |
|
|
77
|
+
| 手动设置强制全量 | `SET cz.optimizer.incremental.force.full.refresh = true` |
|
|
78
|
+
| 维度表变更 | 被 JOIN 的维度表数据变化时,增量结果可能不一致 |
|
|
79
|
+
|
|
80
|
+
**确认是否支持增量刷新**:
|
|
81
|
+
```sql
|
|
82
|
+
SET cz.optimizer.explain.can.incrementalize = true;
|
|
83
|
+
EXPLAIN REFRESH DYNAMIC TABLE my_dt;
|
|
84
|
+
-- 查看 CanBeIncrementalized 字段:Yes = 支持增量,No = 不支持(会给出原因)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## dt-creator/
|
|
90
|
+
创建 Dynamic Table 的参考资料(声明策略、SQL 支持矩阵、增量配置、刷新历史查询)。
|
|
91
|
+
|
|
92
|
+
## dynamic-table-alter/
|
|
93
|
+
修改 Dynamic Table 的结构和属性(suspend/resume、加列删列、改刷新间隔等)。
|
|
94
|
+
|
|
95
|
+
## best-practices/
|
|
96
|
+
Dynamic Table 最佳实践与避坑指南(维度表 JOIN 场景、性能优化、非分区表风险告警)。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 常见问题排障
|
|
101
|
+
|
|
102
|
+
| 问题 | 原因 | 解决方案 |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| 刷新一直是 FULL 模式 | 源表未开启 change_tracking,或查询含不支持增量的算子 | 开启 change_tracking;用 `EXPLAIN REFRESH` 检查 |
|
|
105
|
+
| 刷新延迟超过预期 | VCluster 资源不足,或查询复杂度高 | 升级 VCluster 规格;拆分管道 |
|
|
106
|
+
| `SUSPEND` 后数据不更新 | 已暂停 | 执行 `ALTER DYNAMIC TABLE ... RESUME` |
|
|
107
|
+
| 依赖链中下游不刷新 | 上游 Dynamic Table 刷新失败 | 先修复上游,再手动 `REFRESH` 下游 |
|
|
108
|
+
| 删除报错 | 有下游 Dynamic Table 依赖 | 先删除下游,再删除上游 |
|
|
109
|
+
| 增量结果与全量不一致 | 维度表变更未触发重算 | 执行全量刷新:`SET cz.optimizer.incremental.force.full.refresh = true` |
|
|
110
|
+
| 状态表损坏 | 系统异常 | `SET cz.optimizer.incremental.rebuild.rule.based.state.table = true` |
|
|
111
|
+
| 手动 REFRESH 后历史未显示 | 刷新历史有短暂延迟 | 等待几秒后重新查询 `SHOW DYNAMIC TABLE REFRESH HISTORY` |
|
|
112
|
+
| AP 集群刷新后查询变慢 | AP 集群不支持小文件合并 | 改用 GP 型集群(`CREATE OR REPLACE` 重建) |
|