DeveloperSemantic · 数据
数据管道
加工读取数据集,不重复查询源系统。对象同步只写变化。平台按触发条件执行同步和加工。健康检查显示数据更新状态。
源系统的一张表只同步一次,存成数据集。业务数字在加工里算,对象只放业务粒度。应用和智能体读对象,不读源系统。
说明
前提:已登录(aidc login)。加工、数据集和绑定的写命令要求 developer。
六段,各在哪里看
这一节让你找到管道的每一段,并知道去哪里看它的状态。
| 段 | 做什么 | 谁定义 | 在哪里看 |
|---|---|---|---|
| 数据源 | 客户原有的系统,只读 | 客户 | — |
| 接入 | 数据流(发布端推变化)或 TableImport(平台读) | 开发者 | /semantic/<组织> 的 Data Connection 页 |
| 数据集 | 一次导入或加工的产出,按事务提交 | 平台 | Data Connection 页里的数据集页 |
| 加工 | 从数据集算出新的数据集 | 开发者,定义是 JSON | aidc semantic transforms show |
| 对象 | 数据流或数据集映射到 Object Type 的属性 | Object Type 定义里的 datasources |
/semantic/<组织> 的本体页 |
| 使用 | 应用、智能体、SQL、订阅、自动化 | 应用与自动化的作者 | 应用页,自动化的运行记录 |
读数据的规则
这一节让你按同一个顺序取数据。每一步都读上一步的产出,不回到源系统。
- 先找已经同步的数据集:
aidc semantic datasets --search <表名或中文名>。找不到,由 developer 建 TableImport(数据接入)。不直接查源系统。 - 业务数字(联表、聚合、口径)写成 加工,产出业务粒度的数据集。不写进导入的 SQL,不写进 Action 或定时脚本,也不在应用里拉明细现算。
- 对象只建业务粒度:一个真实的实体一个 Object Type,由数据集供数(接到 Object Type)。原始表不一对一建成对象。同一个实体不建第二个 Object Type。
- 应用和智能体读对象:查询、聚合、SQL。developer 看明细读数据集:
aidc semantic connectivity dataset <RID> --rows 20。 - 人要填的小表(映射、费率、清单)建成对象和 Action。
aidc data import只用于手工整理的小表,每次最多 5,000 行,不导入源系统的数据。 - 数据流只放要秒级推送的小信号,最多 20,000 行。主数据和历史明细不进数据流。
接入的两条路
数据流由发布端推送变化。Data Connection 由平台按需读数据库。两条路线的选法见 数据接入。
数据集与事务
这一节讲数据集的记账方式。每次 TableImport 执行,都写一个数据集的事务。平台拿新的结果和上一份比较,只把变了的行写成对象。
| 导入方式 | 对象怎么变 | 适合 |
|---|---|---|
SNAPSHOT,可带窗口查询 |
对象就是这次读到的行。窗口外的行,和源里已经没有的行,标「源头已消失」 | 只要最近一段时间的数据,如订单、工单 |
APPEND,带增量列 |
只读上次之后改过的行,只增改 | 有可靠修改时间的流水表 |
- 每周对账:
APPEND看不到源头删掉的行。对账仅适用于配置了initialIncrementalState的非旧版 agent worker 导入。距上次全量快照满 7 天,且最近 7 天有成功的执行时,平台在夜里安排全量快照。对账遵守workHours。失败后隔 7 天再试。平台将源头删掉的行标「源头已消失」。 - 上限:每个 TableImport 最多 150,000 行。同一个 TableImport 同时只有一个在途的构建。
- 数据边界:数据集的字节存在组织自己的存储桶里。平台库只存对象的属性值,即同步来的值和动作改过的值。配置、查询和数据集只给本组织的开发者看。
加工
这一节让你从数据集算出新的指标。指标在加工里算,不写在导入的 SQL 里每次整份重算。源数据只读一次。加工从数据集读。
加工是一条 DuckDB 的 SELECT。输入按别名当表用。加工的产出是同名的数据集。
| 写法 | 每次构建算什么 | 适合 |
|---|---|---|
非增量(不写 incremental) |
整份重算 | 小表;要看前后行,如排名、前一天的值 |
append |
只算新加的行,追加到产出 | 逐行的清洗、过滤、补字段 |
mergeAndReplace |
新行涉及的键,在输入里的全部行重算,再按键合并进产出 | 按键汇总,如按表计和班日统计 |
{ "apiName": "stock-balance", "displayName": "库存余额",
"inputs": {
"moves": { "dataset": "stock-moves", "key": ["material_code"] },
"materials": { "dataset": "materials" } },
"sql": "SELECT m.material_code, sum(m.qty) AS on_hand, max(m.moved_at) AS last_move FROM moves m SEMI JOIN materials t ON t.material_code = m.material_code GROUP BY ALL",
"incremental": { "semanticVersion": 1, "snapshotInputs": ["materials"], "output": "mergeAndReplace", "key": ["material_code"] } }
aidc semantic transforms put --ontology cell-demo --file stock-balance.json --dry-run # 先预演:输入、环、名字
aidc semantic transforms put --ontology cell-demo --file stock-balance.json
aidc semantic transforms build <transformRid> --wait
aidc semantic transforms show <transformRid> # 增量还是整份、受影响的键、读写多少行
snapshotInputs是输入的设置,不是写法。参考表整份读。它们的变化不触发构建,也不破坏增量。
以下情况需要整份重算:
- 第一次构建。
semanticVersion变了。- 非 snapshot 的输入被整份替换过,或它的视图被整份替换后又追加了数据。
改了口径要回溯历史,就把 semanticVersion 加一。
- 设了
requireIncremental: true时,输入快照替换引起的整份重算会导致构建失败。这防止大表意外整份重算。 - 输入和定义都没变时,构建直接成功,不执行 SQL。
--force跳过新鲜度判断。增量输入没有新事务时,加工仍不执行 SQL。需要整份重算时,将semanticVersion加一。 - 时间:数据集里不带时区的时间,在 SQL 里是北京时间。
current_date和now()也是北京时间。用它们的 SQL 每次结果都会变,不适合增量。 - 边界:只执行一条
SELECT,只能读这次的输入。输入不能是加工自己的产出。一个数据集只有一个产出者。
接到 Object Type
数据流或数据集绑定到 Object Type 以后,平台把变了的行写成对象。绑定的规则和命令见 数据接入。这一节讲绑定以后,对象怎么变。
upsert(缺省):标准的流。每条记录按主键更新整个对象,后到的为准。这一批里没出现的对象不消失。多行汇成一个对象、保留历史,也用它。mirror:流的全量就是全部对象。数据流里没有的行,对象标「源头已消失」。- 数据集按导入方式决定:
SNAPSHOT相当于mirror,APPEND相当于upsert。 - 定义落了之后,平台先全量同步一次,之后只同步变化。
新鲜度与按需
这一节讲平台什么时候计算。读取请求、自动化、手动执行或定期对账都可以触发 TableImport。
- 读取由 TableImport 或其下游加工供数的 Object Type 时,平台检查上游 TableImport 的新鲜度。导入和连接须处于
active状态。导入须在工作时段内。近期失败时,平台暂缓重试。数据比freshness.maxAgeSeconds旧时,平台触发同步。缺省是 300 秒。平台先返回当前的值,再在后台同步。 ?fresh=true(Python 客户端fresh=True)最多等 20 秒。到时还没同步完,就返回现有的数据。
| 什么在消耗计算 | 什么时候发生 |
|---|---|
| 数据同步 | 有人读,且数据比 maxAgeSeconds 旧;或自动化的对象集条件引用了它 |
| 加工 | 输入提交了新的事务 |
| 应用 | 有人打开。只算当前页 |
| 订阅 | 页面可见时保持连接。隐藏超过 1 分钟断开,切回来续上 |
| 自动化 | 数据一变(对象集条件),或到点(时间条件) |
Data Connection 路线上,常驻的只有 agent proxy 的控制通道。直连的组织没有常驻进程。数据流的发布端装在源系统旁边,常驻运行,每 30 秒发一次心跳。
数据健康
这一节让你知道数据是否在更新。数据集可以挂健康检查。检查失败、升级、恢复时,平台给建检查的人发邮件。
| 检查 | 怎么判 |
|---|---|
buildStatus |
最近一次构建成败。对账的那次构建不算。可以设连续失败几次后升级为 CRITICAL |
timeSinceLastUpdated |
缺省检查最近一个非空已提交事务距今多久 |
schemaComparison |
数据集现在的列,和期望的列比较 |
primaryKey |
指定的列非空,且不重复 |
timeSinceLastUpdated 设置 ignoreEmptyTransactions: false 时,也计入空事务。
- 平台每 5 分钟评估一次检查。
- 同一状态 6 小时内不重复发邮件。每个组织每天最多 50 封。
- 报告和邮件只有状态和计数,不含数据的值。
- 没人读的时段,数据不更新。
timeSinceLastUpdated的上限要按最长的正常空闲时间来设。例如每天都有人读的数据,设 26 小时。 - 要发现「有人要数据却拿不到」,看
buildStatus。构建失败和排队超时都会报。
aidc semantic connectivity health create --file <检查.json> --intent "订单数据每日更新"
计算账:定时与按需
这一节帮你比较定时刷新与按需计算的成本。对象变化会触发自动化评估。数据多久同步一次由平台决定:有人读、或有自动化盯着时才同步。
每天运行次数 = 定时任务数 × (1440 ÷ 间隔分钟)
每天计算量 ≈ 每天运行次数 × 每次耗时(× 每次读的数据量)
| Demo Company(示例) | 定时刷新 | 按需 |
|---|---|---|
| 24 个看板脚本,每 10 分钟一次 | 24 × 144 = 3,456 次 / 天,每次查 ERP 加生成页面约 20 秒,每天约 19 小时计算 | 看板打开时现算当前页。新鲜度由平台按表的大小定(5 分钟到 1 小时)。读取过期数据时触发同步。同一 TableImport 合并在途请求 |
| 临时隧道的保活任务,每分钟一次 | 1,440 次 / 天 | 应用发布在平台上,没有隧道,没有保活 |
| 缺料提醒,每 5 分钟查一遍 ERP 比快照 | 288 次 / 天,大多数次什么都没变 | 对象变化触发评估。有自动化盯着的数据,平台在工作时段每 30 分钟、其余时间每 2 小时同步一次 |
| 数据是不是新的 | 脚本断了也没人知道 | 绑定有同步状态,应用有数据新鲜度组件,健康检查失败会告警 |
定时刷新的任务越积越多,很多看板没人看也每隔几分钟跑一次。按「数据一变、到点、有人看」三种触发重写,大多数可以停掉。大表(2 万行以上)的首次全量放在夜里,写入时盯着错误率。平时只写变化。
把定时看板迁进 Semantic
这一节讲怎么把一个定时看板改成按需的做法。按下面九步做,每一步都可以停下来核对。
- 清点:每个定时任务的频率、读什么、产出什么、谁在看、每天真正被打开几次。
- 分类:
- 数据一变才要做的,做成自动化,条件是对象集的变化。
- 时间本身是条件的(日报、月底对账),做成自动化,条件是时间。
- 有人看才需要的,做成应用,打开时现算。
- 没人用的,直接停。
- 建模:按业务对象建 Object Type,不镜像原表。
- 接数据:用
aidc semantic connectivity explore找表。创建 TableImport,选择 SNAPSHOT 窗口查询或 APPEND 增量列。也可以使用数据流。需要的指标用加工算。在 Object Type 上绑定datasources。 - 做应用或自动化:看板做成应用,打开时现算。提醒做成自动化,在
replaces里写上替掉了哪个定时任务,以及它原来每天跑几次。自动化的详情页会列出这些替代记录。 - 预演:
aidc semantic automations upsert --ontology cell-demo --file <automation.json> --dry-run,看编译出来的对象集和校验结果。 - 并行一轮:新旧同时运行,对上结果。
- 暂停旧任务:暂停,不删除。保留两周,留好恢复的办法。关掉隧道和保活任务。
- 挂健康检查:在关键数据集上加
buildStatus和primaryKey。
自动化的写法见 自动化。
命令行
本页讲的主要命令如下。
| 命令 | 做什么 |
|---|---|
aidc semantic datasets |
找已经同步的数据集 |
aidc semantic transforms put |
建或替换加工 |
aidc semantic transforms show |
看加工:增量还是整份,受影响的键 |
aidc semantic connectivity execute |
执行一次 TableImport |
aidc semantic datasource list |
看数据集和数据流的绑定、同步进度 |
其余命令(imports、build、datasource sync、health create)的参数,见 参考 · 数据接入。
常见错误
| 现象 | 原因 | 怎么办 |
|---|---|---|
| 加工构建失败,产出了受影响的键以外的键 | mergeAndReplace 的 key 表达式写错了 |
检查每个非 snapshot 输入的 key。表达式个数要和产出的键列一样,并按位置对应 |
| 加工构建失败,原因是不能增量 | 设了 requireIncremental,这次要整份重算 |
要整份重算,就把 semanticVersion 加一。或去掉 requireIncremental |
| 构建直接成功,没有运行 | 输入和定义都没变 | --force 只跳过新鲜度判断。整份重算需将 semanticVersion 加一 |
上限一览
| 项 | 上限或缺省 |
|---|---|
| 每个 TableImport | 最多 150,000 行。同时只有一个在途的构建 |
| Data Connection 并发 | 每个 agent 4 个,每个组织直连 4 个,每个组织全量 1 个 |
| 新鲜度 | 平台按表的大小定:5 分钟到 1 小时。fresh=true 最多等 20 秒。freshness 字段照收,但不再生效 |
| 自动化盯着的数据 | 平台在工作时段(北京时间 06:30–23:00)每 30 分钟同步一次,其余时间每 2 小时一次。evaluation 字段照收,但不再生效 |
| 加工的输入 | 1 到 10 个 |
| 加工一次构建 | 读的文件合计最多 384 MB(Parquet 压缩后)。产出最多 500 万行 |
| 加工并发 | 每个组织同时最多 2 个加工在运行 |
| 数据集的产出者 | 只有一个:一个 TableImport 或一个加工 |
| 数据流 | 见 数据接入 · 限制 |
worker 默认执行预算为 260 秒。SQL 计算在此预算内预留 30 秒收尾。对象索引未完成时,心跳会续跑。
下一步
本页由 developer/docs/pipeline.md 生成 · Markdown 原文 · llms.txt