@clickzetta/cz-cli-linux-x64 0.3.1 → 0.3.4
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-cdc-sync-pipeline/SKILL.md +9 -2
- package/bin/skills/clickzetta-data-ingest-pipeline/SKILL.md +1 -1
- package/bin/skills/clickzetta-dw-modeling/SKILL.md +3 -3
- package/bin/skills/clickzetta-dynamic-table/SKILL.md +27 -1
- package/bin/skills/clickzetta-file-import-pipeline/SKILL.md +82 -43
- package/bin/skills/clickzetta-kafka-ingest-pipeline/SKILL.md +262 -154
- package/bin/skills/clickzetta-kafka-ingest-pipeline/references/kafka-pipe-syntax.md +192 -54
- package/bin/skills/clickzetta-lakehouse-connect/SKILL.md +1 -1
- package/bin/skills/clickzetta-oss-ingest-pipeline/SKILL.md +70 -45
- package/bin/skills/clickzetta-sql-pipeline-manager/SKILL.md +79 -53
- package/bin/skills/clickzetta-sql-pipeline-manager/references/dynamic-table.md +40 -28
- package/bin/skills/clickzetta-sql-pipeline-manager/references/pipe.md +133 -71
- package/bin/skills/clickzetta-sql-pipeline-manager/references/table-stream.md +11 -9
- package/bin/skills/clickzetta-table-stream-pipeline/SKILL.md +79 -28
- package/bin/skills/clickzetta-volume-manager/SKILL.md +48 -5
- package/bin/skills/clickzetta-volume-manager/references/volume-ddl.md +7 -2
- package/package.json +1 -1
|
@@ -24,12 +24,15 @@ description: >
|
|
|
24
24
|
|
|
25
25
|
| 功能 | ❌ 错误写法(Snowflake/标准SQL) | ✅ ClickZetta 正确写法 |
|
|
26
26
|
|---|---|---|
|
|
27
|
-
| 动态表计算集群 | `WAREHOUSE = compute_wh` | `
|
|
27
|
+
| 动态表计算集群 | `WAREHOUSE = compute_wh` | `vcluster default`(直接跟名称,不带等号) |
|
|
28
28
|
| 动态表刷新调度 | `TARGET_LAG = '1 minutes'` | `REFRESH INTERVAL 1 MINUTE vcluster default` |
|
|
29
|
-
| Kafka 读取函数 | `
|
|
29
|
+
| Kafka 读取函数 | `TABLE(READ_KAFKA(KAFKA_BROKER => ...))` | `read_kafka('broker', 'topic', '', 'group', '', '', '', '', 'raw', 'raw', 0, MAP(...))` — 位置参数 |
|
|
30
30
|
| 物化视图定时刷新 | `REFRESH EVERY 1 HOUR` | `REFRESH INTERVAL 60 MINUTE vcluster default`(与动态表语法相同) |
|
|
31
31
|
| 物化视图手动刷新 | `REFRESH MATERIALIZED VIEW` 放在 CREATE 里 | 单独执行 `REFRESH MATERIALIZED VIEW <name>;` |
|
|
32
32
|
| 修改动态表 SQL | `ALTER DYNAMIC TABLE ... AS ...` | `CREATE OR REPLACE DYNAMIC TABLE ...`(ALTER 不支持修改 AS 子句) |
|
|
33
|
+
| JSON 字段访问 | `$1:field::TYPE` 或 `data:key` | `parse_json(value::string)['field']::TYPE` 或 `data['key']` |
|
|
34
|
+
| COPY INTO 导入格式 | `FILE_FORMAT = (TYPE = CSV)` | `USING CSV OPTIONS(...)` |
|
|
35
|
+
| COPY INTO 导出格式 | `USING CSV` | `FILE_FORMAT = (TYPE = CSV)` |
|
|
33
36
|
|
|
34
37
|
---
|
|
35
38
|
|
|
@@ -91,14 +94,14 @@ CREATE SCHEMA IF NOT EXISTS ecommerce_gold;
|
|
|
91
94
|
```
|
|
92
95
|
|
|
93
96
|
**来源 → 入口对象的选择规则:**
|
|
94
|
-
- Kafka → `CREATE PIPE ... AS
|
|
95
|
-
- 对象存储(OSS/S3/COS)→ `CREATE PIPE ... VIRTUAL_CLUSTER = name INGEST_MODE = LIST_PURGE AS COPY INTO ... FROM VOLUME <volume_name> USING <format
|
|
97
|
+
- Kafka → `CREATE PIPE ... AS COPY INTO ... FROM (SELECT ... FROM read_kafka('broker', 'topic', '', 'group', '', '', '', '', 'raw', 'raw', 0, MAP(...)))`
|
|
98
|
+
- 对象存储(OSS/S3/COS)→ `CREATE PIPE ... VIRTUAL_CLUSTER = 'name' INGEST_MODE = 'LIST_PURGE' AS COPY INTO ... FROM VOLUME <volume_name> USING <format> PURGE=true`
|
|
96
99
|
- 已有表 + 有 UPDATE/DELETE → `CREATE TABLE STREAM ... WITH PROPERTIES ('TABLE_STREAM_MODE' = 'STANDARD')`,中间层过滤 `__change_type IN ('INSERT', 'UPDATE_AFTER', 'DELETE')`
|
|
97
100
|
- 已有表 + 仅 INSERT → Dynamic Table 直接 `FROM` 源表
|
|
98
101
|
|
|
99
102
|
**刷新频率规则:**
|
|
100
|
-
- 第一个转换层(Bronze→Silver 或 ODS→DWD)设置用户指定的刷新频率(如 `REFRESH
|
|
101
|
-
- 下游层根据业务需求设置各自的刷新频率(如 `REFRESH
|
|
103
|
+
- 第一个转换层(Bronze→Silver 或 ODS→DWD)设置用户指定的刷新频率(如 `REFRESH INTERVAL 1 MINUTE vcluster default`)
|
|
104
|
+
- 下游层根据业务需求设置各自的刷新频率(如 `REFRESH INTERVAL 5 MINUTE vcluster default`)
|
|
102
105
|
|
|
103
106
|
---
|
|
104
107
|
|
|
@@ -146,12 +149,12 @@ CREATE SCHEMA IF NOT EXISTS ecommerce_gold;
|
|
|
146
149
|
阅读对应参考文件后,根据用户提供的参数生成完整可运行 SQL。
|
|
147
150
|
|
|
148
151
|
**必填参数检查:**
|
|
149
|
-
- Dynamic Table:`REFRESH
|
|
152
|
+
- Dynamic Table:`REFRESH INTERVAL N MINUTE vcluster name`、AS 查询
|
|
150
153
|
- Table Stream:源表名、MODE(STANDARD 或 APPEND_ONLY)
|
|
151
|
-
- Pipe(Kafka
|
|
152
|
-
- Pipe(对象存储):Volume
|
|
154
|
+
- Pipe(Kafka):bootstrap_servers、topic、group_id、目标表(位置参数语法)
|
|
155
|
+
- Pipe(对象存储):Volume 路径、文件格式、目标表、`PURGE=true`(LIST_PURGE 模式)
|
|
153
156
|
|
|
154
|
-
若用户未提供 VCLUSTER,默认使用 `default
|
|
157
|
+
若用户未提供 VCLUSTER,默认使用 `default`(GP 型集群)。
|
|
155
158
|
|
|
156
159
|
## 步骤 3:验证
|
|
157
160
|
|
|
@@ -179,28 +182,35 @@ SHOW PIPES;
|
|
|
179
182
|
|
|
180
183
|
```sql
|
|
181
184
|
-- Step 1: 创建 Pipe 持续摄入 Kafka 数据到 ODS 层
|
|
182
|
-
CREATE OR REPLACE PIPE
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
185
|
+
-- ⚠️ 注意:ClickZetta 不支持 CREATE OR REPLACE PIPE,需用 CREATE PIPE 或先 DROP 再 CREATE
|
|
186
|
+
CREATE PIPE kafka_orders_pipe
|
|
187
|
+
VIRTUAL_CLUSTER = 'default'
|
|
188
|
+
BATCH_INTERVAL_IN_SECONDS = '60'
|
|
189
|
+
AS
|
|
190
|
+
COPY INTO ods.orders FROM (
|
|
191
|
+
SELECT
|
|
192
|
+
j['order_id']::STRING,
|
|
193
|
+
j['user_id']::STRING,
|
|
194
|
+
j['amount']::DECIMAL(10,2),
|
|
195
|
+
j['status']::STRING,
|
|
196
|
+
j['created_at']::TIMESTAMP
|
|
197
|
+
FROM (
|
|
198
|
+
SELECT parse_json(value::string) AS j
|
|
199
|
+
FROM read_kafka(
|
|
200
|
+
'kafka.example.com:9092', -- bootstrap_servers
|
|
201
|
+
'orders', -- topic
|
|
202
|
+
'', -- reserved
|
|
203
|
+
'lakehouse_ingest', -- group_id
|
|
204
|
+
'', '', '', '', -- 位置参数留空,由 Pipe 管理
|
|
205
|
+
'raw', 'raw', 0,
|
|
206
|
+
MAP('kafka.security.protocol', 'PLAINTEXT')
|
|
207
|
+
)
|
|
197
208
|
)
|
|
198
209
|
);
|
|
199
210
|
|
|
200
211
|
-- Step 2: 动态表做 DWD 层清洗(每分钟增量刷新)
|
|
201
212
|
CREATE OR REPLACE DYNAMIC TABLE dwd.orders_clean
|
|
202
|
-
REFRESH
|
|
203
|
-
VCLUSTER default
|
|
213
|
+
REFRESH INTERVAL 1 MINUTE vcluster default
|
|
204
214
|
AS
|
|
205
215
|
SELECT
|
|
206
216
|
order_id,
|
|
@@ -214,8 +224,7 @@ WHERE amount > 0;
|
|
|
214
224
|
|
|
215
225
|
-- Step 3: 动态表做 DWS 层聚合(每 5 分钟刷新)
|
|
216
226
|
CREATE OR REPLACE DYNAMIC TABLE dws.order_hourly
|
|
217
|
-
REFRESH
|
|
218
|
-
VCLUSTER default
|
|
227
|
+
REFRESH INTERVAL 5 MINUTE vcluster default
|
|
219
228
|
AS
|
|
220
229
|
SELECT
|
|
221
230
|
DATE_TRUNC('hour', created_at) AS hour,
|
|
@@ -236,19 +245,21 @@ CREATE TABLE STREAM ods.orders_stream
|
|
|
236
245
|
|
|
237
246
|
-- Step 2: 动态表消费 Stream,过滤出最新状态
|
|
238
247
|
CREATE OR REPLACE DYNAMIC TABLE dwd.orders_latest
|
|
239
|
-
REFRESH
|
|
240
|
-
VCLUSTER default
|
|
248
|
+
REFRESH INTERVAL 2 MINUTE vcluster default
|
|
241
249
|
AS
|
|
242
250
|
SELECT order_id, user_id, amount, status, created_at
|
|
243
251
|
FROM ods.orders_stream
|
|
244
|
-
WHERE __change_type IN ('INSERT', 'UPDATE_AFTER'
|
|
252
|
+
WHERE __change_type IN ('INSERT', 'UPDATE_AFTER');
|
|
245
253
|
```
|
|
246
254
|
|
|
247
255
|
### 场景 C:物化视图加速 BI 查询
|
|
248
256
|
|
|
249
257
|
```sql
|
|
250
258
|
-- 创建每小时刷新的物化视图
|
|
251
|
-
CREATE OR REPLACE MATERIALIZED VIEW
|
|
259
|
+
-- ⚠️ 注意:ClickZetta 不支持 CREATE OR REPLACE MATERIALIZED VIEW
|
|
260
|
+
-- 方法 1: 先 DROP 再 CREATE(推荐)
|
|
261
|
+
DROP MATERIALIZED VIEW IF EXISTS dws.mv_daily_revenue;
|
|
262
|
+
CREATE MATERIALIZED VIEW dws.mv_daily_revenue
|
|
252
263
|
COMMENT '每日收入汇总,供 BI 工具查询'
|
|
253
264
|
REFRESH INTERVAL 60 MINUTE vcluster default
|
|
254
265
|
AS
|
|
@@ -260,8 +271,14 @@ SELECT
|
|
|
260
271
|
FROM dwd.orders_clean
|
|
261
272
|
GROUP BY 1, 2;
|
|
262
273
|
|
|
274
|
+
-- 方法 2: 使用 BUILD DEFERRED + DISABLE QUERY REWRITE(复杂,不推荐)
|
|
275
|
+
-- CREATE OR REPLACE MATERIALIZED VIEW ... BUILD DEFERRED DISABLE QUERY REWRITE AS ...
|
|
276
|
+
|
|
263
277
|
-- 手动触发刷新
|
|
264
278
|
REFRESH MATERIALIZED VIEW dws.mv_daily_revenue;
|
|
279
|
+
|
|
280
|
+
-- 删除物化视图(⚠️ 注意:必须用 DROP MATERIALIZED VIEW,不能用 DROP TABLE)
|
|
281
|
+
DROP MATERIALIZED VIEW dws.mv_daily_revenue;
|
|
265
282
|
```
|
|
266
283
|
|
|
267
284
|
### 场景 D:运维操作
|
|
@@ -290,8 +307,7 @@ ALTER PIPE kafka_orders_pipe SET PIPE_EXECUTION_PAUSED = false;
|
|
|
290
307
|
```sql
|
|
291
308
|
-- 创建参数化动态表(使用 SESSION_CONFIGS 定义参数)
|
|
292
309
|
CREATE OR REPLACE DYNAMIC TABLE dwd.orders_partitioned
|
|
293
|
-
REFRESH
|
|
294
|
-
VCLUSTER default
|
|
310
|
+
REFRESH INTERVAL 30 MINUTE vcluster default
|
|
295
311
|
AS
|
|
296
312
|
SELECT order_id, user_id, amount, status, created_at, DATE(created_at) AS dt
|
|
297
313
|
FROM ods.orders
|
|
@@ -306,25 +322,32 @@ REFRESH DYNAMIC TABLE dwd.orders_partitioned
|
|
|
306
322
|
|
|
307
323
|
### 场景 F:动态表 DML 操作(手动修正数据)
|
|
308
324
|
|
|
309
|
-
|
|
325
|
+
⚠️ **重要**:ClickZetta 动态表**不支持 DML 操作**(INSERT/UPDATE/DELETE)。如需修正数据,有以下方案:
|
|
310
326
|
|
|
327
|
+
**方案 1:重建动态表(推荐)**
|
|
311
328
|
```sql
|
|
312
|
-
--
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
-- 手动插入补数据
|
|
316
|
-
INSERT INTO dwd.orders_clean VALUES (999, 'manual_user', 100.00, 'COMPLETED', DATE('2024-06-15'), '2024-06-15');
|
|
329
|
+
-- 1. 在源表中修正数据
|
|
330
|
+
-- 2. 等待动态表自动刷新(下一次 REFRESH INTERVAL 会全量刷新)
|
|
331
|
+
```
|
|
317
332
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
333
|
+
**方案 2:使用普通表替代动态表**
|
|
334
|
+
```sql
|
|
335
|
+
-- 对于需要频繁手动修正的场景,建议使用普通表 + 定时调度任务
|
|
336
|
+
-- 而不是动态表
|
|
337
|
+
CREATE TABLE dwd.orders_manual (
|
|
338
|
+
order_id STRING,
|
|
339
|
+
user_id STRING,
|
|
340
|
+
amount DECIMAL(10,2),
|
|
341
|
+
status STRING,
|
|
342
|
+
created_at TIMESTAMP,
|
|
343
|
+
dt DATE
|
|
344
|
+
);
|
|
321
345
|
```
|
|
322
346
|
|
|
323
|
-
> ⚠️
|
|
324
|
-
> -
|
|
325
|
-
> -
|
|
326
|
-
> -
|
|
327
|
-
> - 仅在数据修正等特殊场景使用 DML
|
|
347
|
+
> ⚠️ **动态表限制**:
|
|
348
|
+
> - 动态表是只读的,不支持 INSERT/UPDATE/DELETE
|
|
349
|
+
> - 数据修正应在源表进行,动态表会自动刷新
|
|
350
|
+
> - 如需手动控制数据,使用普通表 + Studio 调度任务
|
|
328
351
|
|
|
329
352
|
---
|
|
330
353
|
|
|
@@ -333,12 +356,15 @@ DELETE FROM dwd.orders_clean WHERE order_id = 999;
|
|
|
333
356
|
| 错误 | 原因 | 解决方案 |
|
|
334
357
|
|---|---|---|
|
|
335
358
|
| `VCluster not available` | 计算集群未启动或名称错误 | 确认 VCLUSTER 名称,检查集群状态 |
|
|
336
|
-
| 动态表刷新失败 | SQL 查询报错或源表结构变更 | `SHOW DYNAMIC TABLE REFRESH HISTORY` 查看错误详情 |
|
|
359
|
+
| 动态表刷新失败 | SQL 查询报错或源表结构变更 | `SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = 'xxx'` 查看错误详情 |
|
|
337
360
|
| Stream 数据为空 | 已被消费或超出保留周期 | 检查源表 `data_retention_days`,确认是否已消费 |
|
|
338
|
-
| Pipe 停止摄入 | Kafka offset 问题或连接断开 | `DESC PIPE` 查看状态,检查 Kafka 连接 |
|
|
361
|
+
| Pipe 停止摄入 | Kafka offset 问题或连接断开 | `DESC PIPE EXTENDED` 查看状态,检查 Kafka 连接 |
|
|
339
362
|
| `Cannot ALTER AS clause` | 尝试用 ALTER 修改动态表 SQL | 改用 `CREATE OR REPLACE DYNAMIC TABLE` |
|
|
340
|
-
|
|
|
341
|
-
|
|
|
363
|
+
| `CREATE OR REPLACE PIPE` 语法报错 | ClickZetta 不支持该语法 | 用 `CREATE PIPE` 或先 `DROP PIPE` 再 `CREATE` |
|
|
364
|
+
| `CREATE OR REPLACE MATERIALIZED VIEW` 语法报错 | 仅支持 `REWRITE DISABLED + BUILD DEFER` 模式 | 推荐用 `DROP MATERIALIZED VIEW` + `CREATE MATERIALIZED VIEW` |
|
|
365
|
+
| `DROP TABLE` 删除物化视图报错 | 对象类型不匹配 | 用 `DROP MATERIALIZED VIEW`(不是 `DROP TABLE`) |
|
|
366
|
+
| 动态表 DML 报错 `not allowed` | 动态表不支持 DML | 在源表修正数据,或使用普通表 + 调度任务 |
|
|
367
|
+
| `SET cz.sql.dt.allow.dml` 报错 | 不支持 session statement | 动态表不支持 DML 操作,改用其他方案 |
|
|
342
368
|
|
|
343
369
|
---
|
|
344
370
|
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
# Dynamic Table(动态表)SQL 参考
|
|
2
2
|
|
|
3
3
|
> **⚠️ ClickZetta 特有语法**
|
|
4
|
-
> - 刷新调度写法:`REFRESH
|
|
4
|
+
> - 刷新调度写法:`REFRESH INTERVAL 5 MINUTE vcluster default`(不是 `TARGET_LAG`)
|
|
5
5
|
> - 修改调度周期或计算集群必须用 `CREATE OR REPLACE`,`ALTER` 不支持
|
|
6
|
-
> - `ALTER DYNAMIC TABLE` 只支持:SUSPEND / RESUME / SET COMMENT / RENAME COLUMN
|
|
6
|
+
> - `ALTER DYNAMIC TABLE` 只支持:SUSPEND / RESUME / SET COMMENT / RENAME COLUMN / CHANGE COLUMN COMMENT / SET/UNSET PROPERTIES
|
|
7
|
+
> - 删除用 `DROP DYNAMIC TABLE`(不是 `DROP TABLE`)
|
|
8
|
+
> - 恢复用 `UNDROP TABLE`(不是 `UNDROP DYNAMIC TABLE`)
|
|
9
|
+
> - DESC 用 `DESC TABLE name`(不支持 `DESC DYNAMIC TABLE name EXTENDED`)
|
|
7
10
|
|
|
8
11
|
动态表是 ClickZetta Lakehouse 的核心增量计算对象。通过 SQL 查询定义,自动增量刷新,无需手动调度。
|
|
9
12
|
|
|
@@ -16,23 +19,23 @@ CREATE [ OR REPLACE ] DYNAMIC TABLE <name>
|
|
|
16
19
|
[ CLUSTERED BY (<col_name>) ]
|
|
17
20
|
[ COMMENT <comment> ]
|
|
18
21
|
[ PROPERTIES ( data_lifecycle = <day_num> ) ]
|
|
19
|
-
REFRESH [ START WITH <
|
|
20
|
-
|
|
22
|
+
REFRESH [ START WITH TIMESTAMP '<timestamp>' ] INTERVAL <n> { SECOND | MINUTE | HOUR | DAY }
|
|
23
|
+
vcluster <vcluster_name>
|
|
21
24
|
AS
|
|
22
25
|
<query>;
|
|
23
26
|
```
|
|
24
27
|
|
|
25
28
|
**关键参数:**
|
|
26
|
-
- `REFRESH
|
|
27
|
-
- `
|
|
29
|
+
- `REFRESH INTERVAL <n> MINUTE`:刷新间隔,最小 1 分钟
|
|
30
|
+
- `vcluster`:运行刷新任务的计算集群名称(直接跟名称,不带等号和引号)
|
|
28
31
|
- `OR REPLACE`:若同名动态表已存在则替换(修改 SQL 逻辑或调度配置必须用此方式)
|
|
32
|
+
- 建议使用 GP 型集群(如 `default`),AP 型集群不支持小文件合并
|
|
29
33
|
|
|
30
34
|
**示例:**
|
|
31
35
|
```sql
|
|
32
36
|
-- 基础示例:每 5 分钟刷新一次订单汇总
|
|
33
37
|
CREATE OR REPLACE DYNAMIC TABLE dw.order_summary
|
|
34
|
-
REFRESH
|
|
35
|
-
VCLUSTER default
|
|
38
|
+
REFRESH INTERVAL 5 MINUTE vcluster default
|
|
36
39
|
AS
|
|
37
40
|
SELECT
|
|
38
41
|
date_trunc('hour', created_at) AS hour,
|
|
@@ -44,8 +47,7 @@ GROUP BY 1, 2;
|
|
|
44
47
|
|
|
45
48
|
-- 修改调度周期(必须用 CREATE OR REPLACE)
|
|
46
49
|
CREATE OR REPLACE DYNAMIC TABLE dw.order_summary
|
|
47
|
-
REFRESH
|
|
48
|
-
VCLUSTER default
|
|
50
|
+
REFRESH INTERVAL 10 MINUTE vcluster default
|
|
49
51
|
AS
|
|
50
52
|
SELECT
|
|
51
53
|
date_trunc('hour', created_at) AS hour,
|
|
@@ -66,17 +68,17 @@ ALTER DYNAMIC TABLE <name> SUSPEND;
|
|
|
66
68
|
ALTER DYNAMIC TABLE <name> RESUME;
|
|
67
69
|
|
|
68
70
|
-- 修改注释
|
|
69
|
-
ALTER DYNAMIC TABLE <name> SET COMMENT <comment
|
|
71
|
+
ALTER DYNAMIC TABLE <name> SET COMMENT '<comment>';
|
|
70
72
|
|
|
71
73
|
-- 修改列名
|
|
72
74
|
ALTER DYNAMIC TABLE <name> RENAME COLUMN <old_col> TO <new_col>;
|
|
73
75
|
|
|
74
|
-
--
|
|
75
|
-
ALTER DYNAMIC TABLE <name> CHANGE COLUMN <col_name> COMMENT <comment
|
|
76
|
+
-- 修改列注释(注意用 CHANGE COLUMN)
|
|
77
|
+
ALTER DYNAMIC TABLE <name> CHANGE COLUMN <col_name> COMMENT '<comment>';
|
|
76
78
|
|
|
77
79
|
-- 修改属性
|
|
78
|
-
ALTER DYNAMIC TABLE <name> SET PROPERTIES (
|
|
79
|
-
ALTER DYNAMIC TABLE <name> UNSET PROPERTIES (
|
|
80
|
+
ALTER DYNAMIC TABLE <name> SET PROPERTIES ('key' = 'value');
|
|
81
|
+
ALTER DYNAMIC TABLE <name> UNSET PROPERTIES ('key');
|
|
80
82
|
```
|
|
81
83
|
|
|
82
84
|
> 注意:修改调度周期、计算集群、SQL 查询逻辑,必须用 `CREATE OR REPLACE DYNAMIC TABLE`,ALTER 不支持这些操作。
|
|
@@ -91,7 +93,11 @@ REFRESH DYNAMIC TABLE <name>;
|
|
|
91
93
|
## DROP DYNAMIC TABLE
|
|
92
94
|
|
|
93
95
|
```sql
|
|
96
|
+
-- ⚠️ 必须用 DROP DYNAMIC TABLE,不能用 DROP TABLE
|
|
94
97
|
DROP DYNAMIC TABLE [ IF EXISTS ] <name>;
|
|
98
|
+
|
|
99
|
+
-- 恢复已删除的动态表(⚠️ 用 UNDROP TABLE,不是 UNDROP DYNAMIC TABLE)
|
|
100
|
+
UNDROP TABLE <name>;
|
|
95
101
|
```
|
|
96
102
|
|
|
97
103
|
## SHOW / DESC
|
|
@@ -103,25 +109,27 @@ SHOW TABLES WHERE is_dynamic = true;
|
|
|
103
109
|
-- 列出指定 schema 下的动态表
|
|
104
110
|
SHOW TABLES IN <schema_name> WHERE is_dynamic = true;
|
|
105
111
|
|
|
106
|
-
--
|
|
112
|
+
-- 查看动态表结构
|
|
107
113
|
DESC TABLE <name>;
|
|
108
|
-
DESCRIBE DYNAMIC TABLE <name> EXTENDED;
|
|
109
114
|
|
|
110
115
|
-- 查看完整建表语句
|
|
111
116
|
SHOW CREATE TABLE <name>;
|
|
112
117
|
|
|
113
118
|
-- 查看刷新历史(状态、耗时、触发方式、增量行数)
|
|
114
|
-
SHOW DYNAMIC TABLE REFRESH HISTORY <
|
|
115
|
-
SHOW DYNAMIC TABLE REFRESH HISTORY <name> LIMIT 20;
|
|
119
|
+
SHOW DYNAMIC TABLE REFRESH HISTORY WHERE name = '<dt_name>' LIMIT 20;
|
|
116
120
|
```
|
|
117
121
|
|
|
122
|
+
> ⚠️ **DESC 注意**:动态表用 `DESC TABLE name`,不支持 `DESC DYNAMIC TABLE name EXTENDED`(EXTENDED 会报错)。
|
|
123
|
+
|
|
118
124
|
## 注意事项
|
|
119
125
|
|
|
120
126
|
- 修改 SQL 逻辑、调度周期、计算集群 → 用 `CREATE OR REPLACE`,不能用 `ALTER`
|
|
121
127
|
- 刷新间隔最小 1 分钟
|
|
122
|
-
-
|
|
128
|
+
- 删除用 `DROP DYNAMIC TABLE`(不是 `DROP TABLE`)
|
|
129
|
+
- 恢复用 `UNDROP TABLE`(不是 `UNDROP DYNAMIC TABLE`)
|
|
123
130
|
- 刷新失败不影响表的可查询性(返回上次成功版本的数据)
|
|
124
131
|
- 非简单加列/减列的 `CREATE OR REPLACE` 会触发一次全量刷新
|
|
132
|
+
- 建议使用 GP 型集群(如 `default`),AP 型集群不支持小文件合并
|
|
125
133
|
|
|
126
134
|
## 参数化动态表(SESSION_CONFIGS)
|
|
127
135
|
|
|
@@ -130,8 +138,7 @@ SHOW DYNAMIC TABLE REFRESH HISTORY <name> LIMIT 20;
|
|
|
130
138
|
```sql
|
|
131
139
|
-- 创建参数化动态表
|
|
132
140
|
CREATE OR REPLACE DYNAMIC TABLE dwd.orders_partitioned
|
|
133
|
-
REFRESH
|
|
134
|
-
VCLUSTER default
|
|
141
|
+
REFRESH INTERVAL 30 MINUTE vcluster default
|
|
135
142
|
AS
|
|
136
143
|
SELECT order_id, user_id, amount, dt
|
|
137
144
|
FROM ods.orders
|
|
@@ -146,18 +153,23 @@ REFRESH DYNAMIC TABLE dwd.orders_partitioned
|
|
|
146
153
|
|
|
147
154
|
## 动态表 DML 操作
|
|
148
155
|
|
|
149
|
-
动态表默认不支持 DML
|
|
156
|
+
动态表默认不支持 DML,需先开启参数(每次 DML 前都需要 SET):
|
|
150
157
|
|
|
151
158
|
```sql
|
|
152
|
-
--
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
-- 支持的 DML 操作
|
|
159
|
+
-- ⚠️ 必须在同一会话/批次中先执行 SET,再执行 DML
|
|
160
|
+
SET cz.sql.dt.allow.dml = true;
|
|
156
161
|
INSERT INTO <name> VALUES (...);
|
|
162
|
+
|
|
163
|
+
-- 删除
|
|
164
|
+
SET cz.sql.dt.allow.dml = true;
|
|
157
165
|
DELETE FROM <name> WHERE ...;
|
|
158
166
|
```
|
|
159
167
|
|
|
160
|
-
> ⚠️
|
|
168
|
+
> ⚠️ **DML 注意事项**:
|
|
169
|
+
> - `SET cz.sql.dt.allow.dml = true` 必须与 DML 语句在同一执行批次中
|
|
170
|
+
> - 执行 DML 后,下一次自动刷新会触发**全量刷新**(而非增量),可能耗时较长
|
|
171
|
+
> - UPDATE 可能因内部隐藏列(`MV__KEY`)报错,建议改用 DELETE + INSERT
|
|
172
|
+
> - 仅在数据修正等特殊场景使用 DML
|
|
161
173
|
|
|
162
174
|
## 参考文档
|
|
163
175
|
|