@guandata/guanetl 0.1.15 → 0.1.16
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/CHANGELOG.md +8 -0
- package/README.md +8 -1
- package/binaries/guanetl-darwin-arm64 +0 -0
- package/binaries/guanetl-darwin-x64 +0 -0
- package/binaries/guanetl-linux-arm64 +0 -0
- package/binaries/guanetl-linux-x64 +0 -0
- package/binaries/guanetl-win32-x64.exe +0 -0
- package/package.json +1 -1
- package/skills/guanetl/SKILL.md +11 -0
- package/skills/guanetl/references/ETL_AI_DEVELOP.md +39 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## @guandata/guanetl 0.1.16 - 2026-06-17
|
|
4
|
+
|
|
5
|
+
- `save --dry-run` 增加保存影响预览基础能力,帮助在提交前检查关键配置变化。
|
|
6
|
+
- `run` 会在执行前提示上游数据集失败状态,降低基于异常上游继续执行的风险。
|
|
7
|
+
- `schedule` 修复上游触发调度的默认输入处理,减少调度配置误差。
|
|
8
|
+
- `export` / `save` 增强输入字段类型校验,并在 `preview` 中提示 LEFT JOIN 桥接列全空样本。
|
|
9
|
+
|
|
3
10
|
## @guandata/guanetl 0.1.15 - 2026-06-15
|
|
4
11
|
|
|
5
12
|
- `save` 增强输出数据集保护,保留级联相关配置,并对追加写入场景的行数据结构提前校验。
|
|
13
|
+
- `preview` 对 `LEFT_OUTER` JOIN 的右表桥接列增加全 null 样本告警,提示检查 join 键值域是否匹配。
|
|
6
14
|
- 补充多输出数据集和追加写入保存流程说明,降低 ETL 保存时误改输出配置的风险。
|
|
7
15
|
|
|
8
16
|
## @guandata/guanetl 0.1.14 - 2026-06-09
|
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ guanetl save --dir <work_dir>
|
|
|
25
25
|
|
|
26
26
|
标准 ETL 写入闭环:`create/edit → export → preview → save → run --wait`。
|
|
27
27
|
|
|
28
|
-
> **触发成功 ≠ ETL 执行成功**:`run` 返回"执行已触发"仅表示后端接受了请求。使用 `run --wait` 等待终态,FAILED
|
|
28
|
+
> **触发成功 ≠ ETL 执行成功**:`run` 返回"执行已触发"仅表示后端接受了请求。使用 `run --wait` 等待终态,FAILED 时会展示真实错误消息。触发前会检查直接上游数据集状态;若发现上游处于失败态,会先输出警告但继续执行,可用 `--skip-upstream-check` 跳过检查。
|
|
29
29
|
|
|
30
30
|
新建 ETL 时注意目录树不同:`create --parent-dir` 使用 ETL 目录树 id,输出数据集目录使用 DATA_SET 目录树 id。可用 `guancli etl tree` / `guancli ds tree` 分别查询,或用 `guanetl mkdir-pair` 成对创建。
|
|
31
31
|
|
|
@@ -39,6 +39,13 @@ guanetl install-skill
|
|
|
39
39
|
|
|
40
40
|
## 版本更新
|
|
41
41
|
|
|
42
|
+
### @guandata/guanetl 0.1.16
|
|
43
|
+
|
|
44
|
+
- `save --dry-run` 增加保存影响预览基础能力,帮助在提交前检查关键配置变化。
|
|
45
|
+
- `run` 会在执行前提示上游数据集失败状态,降低基于异常上游继续执行的风险。
|
|
46
|
+
- `schedule` 修复上游触发调度的默认输入处理,减少调度配置误差。
|
|
47
|
+
- `export` / `save` 增强输入字段类型校验,并在 `preview` 中提示 LEFT JOIN 桥接列全空样本。
|
|
48
|
+
|
|
42
49
|
### @guandata/guanetl 0.1.15
|
|
43
50
|
|
|
44
51
|
- `save` 增强输出数据集保护,保留级联相关配置,并对追加写入场景的行数据结构提前校验。
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/skills/guanetl/SKILL.md
CHANGED
|
@@ -133,6 +133,7 @@ guanetl edit <etl_id> --dir <work_dir>
|
|
|
133
133
|
```bash
|
|
134
134
|
guanetl export --dir <work_dir>
|
|
135
135
|
guanetl preview <node_id> --dir <work_dir>
|
|
136
|
+
guanetl save --dir <work_dir> --dry-run
|
|
136
137
|
guanetl save --dir <work_dir>
|
|
137
138
|
guanetl run <etl_id> --wait # 可选:保存后触发执行并等待完成
|
|
138
139
|
```
|
|
@@ -143,6 +144,8 @@ guanetl run <etl_id> --wait # 可选:保存后触发执行并等待
|
|
|
143
144
|
|
|
144
145
|
只追加输出列是安全例外:新增列、不改名、不删已有列、不改已有列类型,并保持原 `OUTPUT_DATASET` 节点 id 和 `outputDsName` 时,可以原地 `save`,保存前仍需 `preview` 目标输出确认结果。改列名、删列、改类型、换输入数据集、重接输出链路或更换输出节点 id 都按下游绑定风险处理。
|
|
145
146
|
|
|
147
|
+
保存前优先执行 `save --dry-run` 查看影响报告;`--format json` 可用于自动化检查。dry-run 不调用 direct-save,若报告出现阻断风险,先修 `etl/` 后重新 `export -> preview -> save --dry-run`。
|
|
148
|
+
|
|
146
149
|
### 新建 ETL
|
|
147
150
|
|
|
148
151
|
1. 先用 `guancli` 查输入数据集和字段。
|
|
@@ -185,6 +188,8 @@ guanetl create --name "ETL名称" --dir <work_dir> --parent-dir <etl_dir_id> --o
|
|
|
185
188
|
3. 将本地修改合并到服务端版本
|
|
186
189
|
4. 调用 direct-save API 写入
|
|
187
190
|
|
|
191
|
+
`save --dry-run` 只执行到合并和保存影响检查,不执行第 4 步。
|
|
192
|
+
|
|
188
193
|
用户不需要手写服务端保存 payload。只要 `etl/` 修改正确、`export` 通过,`save` 就能完成服务端保存。
|
|
189
194
|
|
|
190
195
|
### run --wait 与任务状态
|
|
@@ -193,6 +198,7 @@ guanetl create --name "ETL名称" --dir <work_dir> --parent-dir <etl_dir_id> --o
|
|
|
193
198
|
|
|
194
199
|
- 不加 `--wait` 时,`run` 只触发并返回 `taskId`。
|
|
195
200
|
- 加 `--wait` 后,CLI 会轮询任务状态直到终态(FINISHED / FAILED / CANCELED),FAILED 时会展示真实错误消息。
|
|
201
|
+
- 触发前,`run` 会检查直接上游数据集状态;若发现上游处于 `FAILED`/`失败` 态,会先输出警告但继续触发执行。确认不需要检查时可加 `--skip-upstream-check`。
|
|
196
202
|
- 如果不加 `--wait` 后想查状态:`task status <taskId>` 或 `task wait <taskId>`。
|
|
197
203
|
|
|
198
204
|
### 排查执行失败
|
|
@@ -250,12 +256,16 @@ guanetl schedule <etl_id> --disable # 关闭调
|
|
|
250
256
|
|
|
251
257
|
```bash
|
|
252
258
|
# 任一上游数据集更新后执行
|
|
259
|
+
guanetl schedule <etl_id> --trigger upstream
|
|
253
260
|
guanetl schedule <etl_id> --trigger upstream --inputs <dsId1>,<dsId2>
|
|
254
261
|
|
|
255
262
|
# 全部上游数据集更新后执行
|
|
263
|
+
guanetl schedule <etl_id> --trigger upstream-all
|
|
256
264
|
guanetl schedule <etl_id> --trigger upstream-all --inputs <dsId1>,<dsId2>
|
|
257
265
|
```
|
|
258
266
|
|
|
267
|
+
不指定 `--inputs` 时,`guanetl` 会读取 ETL 当前输入数据集并默认全部监听;指定 `--inputs` 时只监听列出的 dsId。
|
|
268
|
+
|
|
259
269
|
### 定时调度类型说明
|
|
260
270
|
|
|
261
271
|
| cron-type | 参数 | 说明 |
|
|
@@ -295,6 +305,7 @@ guanetl task cancel <t1> <t2> # 批量取消多个任务
|
|
|
295
305
|
- 输入字段 schema 优先维护在 `BasicInputDataset(..., []Field{...})` 中。
|
|
296
306
|
- 新版 ETL 默认以输入字段 `alias` / 展示名作为算子列名;字段存在别名时,SQL 和直接列名算子优先使用展示名,raw name 只作为底层数据集元数据理解。
|
|
297
307
|
- ETL 执行时以真实数据集字段元数据为准;如果需要设置或确认展示名,先用 `guands dataset fields <dsId>` / `guands dataset alias <dsId> --fd-id <fdId> --alias "展示名"`,不要只在 `etl.go` 手写 alias 后假设服务端会采用。
|
|
308
|
+
- 本地字段解析优先级为 `alias -> displayName/showName/title -> name`;遇到同一来源下有效字段名重复,先消除歧义再继续写算子。
|
|
298
309
|
- 新增 SQL 节点时,要同步新增对应 `.sql` 文件。
|
|
299
310
|
- 对 `edit` 导入出来的 ETL,优先局部修改,不要为“重构”大面积推翻。
|
|
300
311
|
- **文件访问边界**:只允许访问以下路径,不要主动探索或读取用户未明确授权的其他目录:
|
|
@@ -62,12 +62,48 @@ orders := BasicInputDataset("id_1001", "订单", "ds_orders", []Field{
|
|
|
62
62
|
- `meta.json` 主要保留 ETL 名称等元信息。
|
|
63
63
|
- 字段相关报错时,优先检查 `[]Field`,不要先怀疑 `meta.json`。
|
|
64
64
|
|
|
65
|
+
## ODS 展示格式字符串先解析再声明数值
|
|
66
|
+
|
|
67
|
+
`guancli ds get` 只能告诉你字段声明类型;ODS / mock / 平台导出表可能把 UI 展示值原样存成 `STRING`,例如 `"13小时31分"`、`"27.69%"`、`"90"`。写 DWD 前先执行 `guancli ds preview <dsId>` 看样本;如果 preview 提示 STRING 样本像展示格式,不能在 `BasicInputDataset` 里直接把该字段声明成 `DOUBLE` / `LONG` 后聚合。
|
|
68
|
+
|
|
69
|
+
`guanetl export` 会通过数据集详情接口校验输入字段 schema:服务端字段是 `STRING` 时,`BasicInputDataset` 不能把它声明成 `DOUBLE` / `LONG` / `DATE` 等非 STRING 类型。
|
|
70
|
+
|
|
71
|
+
推荐先用 `BasicCalculator` 或 SQL 显式解析成新的数值列,再让下游聚合引用新列:
|
|
72
|
+
|
|
73
|
+
```go
|
|
74
|
+
calc := BasicCalculator("id_1002", "解析展示格式度量", inputA, []Formula{
|
|
75
|
+
{
|
|
76
|
+
Name: "下单转化率_数值",
|
|
77
|
+
Type: "DOUBLE",
|
|
78
|
+
Expr: "CAST(REPLACE([下单转化率], \"%\", \"\") AS DOUBLE) / 100",
|
|
79
|
+
Key: "formula_order_rate_value",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
Name: "营业时长_分钟",
|
|
83
|
+
Type: "DOUBLE",
|
|
84
|
+
Expr: "CAST(IF(REGEXP_EXTRACT([营业时长], \"([0-9.]+)小时\", 1) = \"\", \"0\", REGEXP_EXTRACT([营业时长], \"([0-9.]+)小时\", 1)) AS DOUBLE) * 60 + CAST(IF(REGEXP_EXTRACT([营业时长], \"([0-9.]+)分\", 1) = \"\", \"0\", REGEXP_EXTRACT([营业时长], \"([0-9.]+)分\", 1)) AS DOUBLE)",
|
|
85
|
+
Key: "formula_open_minutes",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
Name: "店铺分_数值",
|
|
89
|
+
Type: "DOUBLE",
|
|
90
|
+
Expr: "CAST([店铺分] AS DOUBLE)",
|
|
91
|
+
Key: "formula_store_score_value",
|
|
92
|
+
},
|
|
93
|
+
}, Position{X: 320, Y: 100})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
- 百分比字符串先去 `%`,再确认业务语义是 `27.69` 还是 `0.2769`。
|
|
97
|
+
- 中文时长要统一成明确单位,例如分钟或秒。
|
|
98
|
+
- 纯数字字符串可能是编码 / ID;确认不是维度编码后再 cast。
|
|
99
|
+
|
|
65
100
|
## 字段 name / alias / showName 规则
|
|
66
101
|
|
|
67
102
|
后端 ETL 的展示名语义主要来自字段 `alias`,有些接口或前端上下文会叫 `displayName` / `showName`。
|
|
68
103
|
|
|
69
104
|
- 新版 ETL 默认使用输入字段别名:如果数据集字段有 `alias`,进入 ETL 算子后的列名通常是 `alias`;没有 `alias` 时才是原始 `name`。
|
|
70
105
|
- 输入字段别名的事实源是数据集字段元数据;可用 `guands dataset fields <dsId>` 回读,用 `guands dataset alias <dsId> --fd-id <fdId> --alias "展示名"` 更新。`BasicInputDataset(..., []Field{...})` 中的字段 schema 主要用于导入/导出和本地 lint,不会把一个未设置过数据集 alias 的字段强制变成展示名列。
|
|
106
|
+
- 本地校验按 `alias -> displayName/showName/title -> name` 解析有效字段名;同一来源下两个字段解析成相同有效名会被视为歧义,建模前应先改名或明确上游输出。
|
|
71
107
|
- SQL 节点使用上游表 `input1`、`input2` 的当前列名。字段有中文展示名时,SQL 里应写展示名并用反引号,例如 ``SELECT `门店ID` FROM input1``。
|
|
72
108
|
- `SELECT_COLUMNS`、`FILTER_ROWS`、`REMOVE_DUPLICATES`、`GROUP_BY` 等直接列名算子,也以当前上游列名为准。
|
|
73
109
|
- 底层数据集读取和数据集元数据仍保留原始 `name`,所以 `guancli` / `guands` 输出字段时要同时关注 `name` 和 `alias`。
|
|
@@ -304,7 +340,8 @@ func DefineETL() []Node {
|
|
|
304
340
|
|
|
305
341
|
1. `guanetl export --dir <work_dir>`
|
|
306
342
|
2. 需要看结果时:`guanetl preview <node_id> --dir <work_dir>`
|
|
307
|
-
3.
|
|
343
|
+
3. 保存前先看影响:`guanetl save --dir <work_dir> --dry-run`
|
|
344
|
+
4. 确认无误后:`guanetl save --dir <work_dir>`
|
|
308
345
|
|
|
309
346
|
如果 `export` 没过,不要直接 `save`。
|
|
310
347
|
|
|
@@ -319,6 +356,7 @@ func DefineETL() []Node {
|
|
|
319
356
|
- 不要为了绕过同名错误手动删除旧输出数据集;旧输出通常仍被 ETL 依赖。
|
|
320
357
|
- 如果确实要创建新输出数据集,必须同时更换 `OUTPUT_DATASET` 节点 id,并设置新的 `outputDsName` 或 `parentDirId`;只改名称会被视为已有输出绑定风险。
|
|
321
358
|
- `save` 如果在 direct-save 前提示输出绑定风险,先修本地 `etl.go` / `meta.json`,再重新 `export -> preview -> save`。
|
|
359
|
+
- `save --dry-run` 只生成保存影响报告,不调用 direct-save;需要机器可读结果时加 `--format json`。报告里出现阻断级输出绑定风险时,必须先修本地定义,不能继续真实 `save`。
|
|
322
360
|
|
|
323
361
|
## Appendix: Framework Surface
|
|
324
362
|
|