本文以销售订单清洗汇总为例,讲解 VeryReport 数据清洗(轻量 ETL):从源表读入、筛选与加工、聚合后写回目标表。无需手写 SQL,通过画布拖拽完成。
范围说明:数据清洗(轻量 ETL)位于「数据中心 → 数据清洗」(/data/etl),用于对数据源表或数据集做可视化加工,结果写回数据库表。与数据集(建模/语义层)、自助取数(拖拽导出)、Vera 问数(自然语言查数)是不同模块。能力依据《数据清洗设计》文档。1. 功能概述
数据清洗是「数据源 → 数据集 → 分析可视化」链路中的加工环节。设计器采用 DAG(有向无环图)画布:节点间以内存行数据(List<Map>)传递,拓扑排序后逐节点执行。任务定义存于 bi_etl_job.definition_json,运行记录存于 bi_etl_run_log,并与资源树(resource_type=ETL)统一管理。
| 阶段 | 说明 | 入口 |
|---|---|---|
| 准备数据 | 配置数据源或数据集 | 数据中心 → 数据源 / 数据集 |
| 新建任务 | 创建清洗任务并进入设计器 | 数据清洗 → 新建 |
| 画布设计 | 拖拽节点、连线、配置 | ETL 设计器 |
| 预览校验 | 节点预览 + DAG 校验 | 设计器工具栏 / 节点右键 |
| 发布运行 | 保存发布、手动或周期运行 | 保存并发布 / 运行 |
2. 能达到的目标
- 可视化加工:拖拽节点完成筛选、关联、聚合、转置、字段清洗;
- 多源输入:支持 JDBC 数据源表与已有数据集作为输入;
- 结果落库:写入已有表或自动建表,支持覆盖/追加;
- 可预览可追溯:任意节点预览前 100 行;运行历史与执行日志可查;
- 占位符参数化:表名、筛选值支持
${yyyyMMdd}等动态变量; - 发布与调度:任务可发布上线,配置手动或周期运行(日/周/月)。
2.1 预期效果(本示例)
- 从
orders表读入订单数据; - 筛选「订单金额 > 0」;
- 新增含税金额字段;
- 按区域聚合销售额;
- 覆盖写入
region_summary表。
3. 操作步骤
3.1 准备数据源
- 在 数据中心 → 数据源 配置 JDBC 连接(MySQL、Oracle 等)。
- 确认源库存在业务表(如
orders),且目标库可写入汇总表(如region_summary)。
3.2 新建清洗任务
- 进入 数据中心 → 数据清洗(
/data/etl)。 - 左侧资源树选择文件夹,点击 新建 → 清洗任务,或在列表页点击新建。
- 系统创建任务并跳转 ETL 设计器(
/data/etl/design/{jobId})。 - 顶部双击可修改任务名称,如「销售订单区域汇总」。
3.3 搭建画布(三栏设计器)
设计器布局:左侧节点面板|中央 Vue Flow 画布|右侧配置面板。
| 节点 | 分类 | 作用 |
|---|---|---|
| 数据输入 | 输入 | 从数据源表或数据集读取 |
| 清洗加工 | 预处理 | 筛选、计算字段、类型转换、合并拆分等 |
| 关联 | 转换 | 多表 JOIN(内/左/右/全连接) |
| 合并 | 转换 | 多路上游 UNION 合并 |
| 聚合 | 转换 | 分组 + SUM/AVG/COUNT 等汇总 |
| 转置 | 转换 | 行转列 / 列转行(宽表 ↔ 长表) |
| 数据输出 | 输出 | 写入已有表或新建表 |
本示例最小链路:
数据输入(orders) → 清洗加工(筛选+计算) → 聚合(按区域) → 数据输出(region_summary)步骤 A:添加「数据输入」节点
- 从左侧面板拖入 数据输入 到画布。
- 右侧配置:
- 输入类型选 数据源表(或数据集);
- 选择数据源与表名
orders; - 勾选需要的字段(如 order_id、region、amount、order_date)。
- 点击 预览 查看前 100 行样例数据。
步骤 B:添加「清洗加工」节点
- 拖入 清洗加工,将输入节点连线到清洗节点。
- 在右侧「加工操作」中依次添加:
- 筛选:字段 amount,运算符 >,值 0;
- 计算字段:total_with_tax = amount * 1.13;
- (可选)类型转换:amount → 数值类型。
- 保存配置后预览,确认加工结果正确。
| 操作 | 说明 | 示例 |
|---|---|---|
| FILTER | 行筛选 | 订单金额 > 0 |
| CALC_FIELD | 计算字段 | amount * 1.13 → total_with_tax |
| TYPE_CAST | 类型转换 | 字符串转数值 |
| VALUE_REPLACE | 值替换 | 空值 → 未知 |
| RENAME_FIELD | 重命名字段 | user_id → 用户ID |
| REMOVE_FIELD | 删除字段 | 去掉冗余列 |
| COPY_FIELD | 复制字段 | 复制一列作备份 |
| CONCAT_FIELD | 合并字段 | 姓 + 名 → 全名 |
| SPLIT_FIELD | 拆分字段 | 地址按分隔符拆分 |
| GROUP_ASSIGN | 分组赋值 | 按规则给新字段赋值 |
步骤 C:添加「聚合」与「数据输出」
- 拖入 聚合 节点并连线:
- 分组字段:region(区域);
- 汇总指标:amount → SUM,别名 sales_total。
- 拖入 数据输出 并连线到聚合节点:
- 输出类型:已有表 或 新建表;
- 选择目标数据源与表名
region_summary; - 写入模式选 覆盖(OVERWRITE) 或 追加(APPEND)。
| 写入模式 | 说明 |
|---|---|
| OVERWRITE | 先清空目标表再写入(覆盖) |
| APPEND | 追加写入,主键冲突会报错 |
| UPSERT | 当前版本等同 APPEND |
3.4 校验、保存与发布
- 画布必须包含至少一个数据输入和一个数据输出,且节点间有连线、无环路;顶部徽章会提示配置错误数量。
- 点击 保存 写入
definition_json。 - 配置无误后点 保存并发布,任务状态变为「已发布」。
- (可选)点 占位符管理 配置
${region}、${yyyyMMdd}等动态参数,用于表名或筛选值。
3.5 运行任务
- 在设计器或列表页点击 运行;若配置了占位符,可通过「带参数运行」临时覆盖。
- 运行中状态显示为「运行中」,可点 终止 中途停止。
- 完成后查看「运行成功 / 失败」状态;打开 运行历史 查看每次输入/输出行数与执行日志。
- 通过 运行配置(⋮ 更多菜单)设置周期调度:手动 / 每日 / 每周 / 每月。
4. 占位符(可选)
占位符用于按天/按租户动态替换表名或条件值,常见写法:
| 占位符 | 说明 |
|---|---|
| ${yyyyMMdd} | 当天日期,如 20260710 |
| ${yyyy-MM-dd} | 当天日期带横线 |
| ${yyyyMMdd-1} | 昨天 |
| ${region} | 用户自定义键值(在占位符管理中配置) |
| ${jobId} / ${runId} | 系统注入,不可修改 |
生效字段包括:输入/输出表名,清洗节点的筛选值、表达式、替换值等。
5. 使用限制与注意事项
| 限制项 | 建议值 | 说明 |
|---|---|---|
| 数据输入节点 | 最多 5 个 | 多源关联/合并时使用 |
| 数据输出节点 | 仅 1 个 | 每个任务一个落库目标 |
| 单节点字段数 | 最多 200 个 | 过多字段影响性能 |
| 执行模式 | 内存执行 | 大数据量建议控制输入范围或分批 |
- 当前版本内存逐节点执行,适合中小数据量;超大数据集建议先在源端过滤或分批处理。
- 关联节点左右表顺序:第 1 个上游为左表,第 2 个为右表;同名列会被右表覆盖。
- 输出到数据集类型当前运行时跳过,请优先写回数据库表。
- 清洗后的表可作为数据集引用,供报表、仪表板、Vera 问数使用。
6. 权限说明
| 权限点 | 能力 |
|---|---|
| data:etl:view | 查看任务与运行记录 |
| data:etl:create | 新建任务 / 文件夹 |
| data:etl:edit | 编辑画布、发布、调度配置 |
| data:etl:delete | 删除 / 软删除任务 |
| data:etl:execute | 手动运行、终止运行 |
使用数据集作为输入时,还需具备对应数据集的 USE 权限。