Define once. Use everywhere.¶
OSI 原生的指标语义层:一次定义,处处使用
进去是一份开放模型,出来是各数仓各自正确的 SQL。
revenue 在 DuckDB、Postgres、Snowflake、ClickHouse、StarRocks
上算,含义都一样。
它解决什么问题¶
指标的含义,看板里写一遍,SQL 里写一遍,notebook 里又写一遍。写着写着就对不上了: 一处过滤了已取消订单,另一处没过滤;一次不留神的 JOIN 把总额悄悄翻了倍。 最后两个数都说自己"正确",却谁也对不上谁。
Dosi 把每个指标收敛到一处定义,SQL 由它生成。同一份定义,在每个数仓上都算得对, 重复计数这类错误在设计上就被排除了。
30 秒看懂¶
在模型里定义一次,之后按名字取用:
$ dosi list metrics --model fixtures/orders/model.yaml
NAME KIND DATASETS DESCRIPTION
revenue aggregate orders Total order amount
order_count aggregate orders Number of orders
unique_customers aggregate orders Distinct purchasing customers
avg_order_value ratio orders Revenue per order (ratio)
total_margin expression orders, products Revenue minus cost (expression over two aggregates)
$ dosi query --model fixtures/orders/model.yaml \
--metrics revenue --group-by orders.status --execute --db orders.db
status revenue
completed 350
cancelled 100
2 rows
换成 --dialect snowflake,SQL 就变了,模型一个字不用动。
团队为什么用它¶
-
一份模型,多个数仓
同一份 OSI 模型能编译出 13 种以上方言的正确 SQL。换数仓只改一个参数,不用重写。
-
正确性由构造保证
有扇出保护,绝不会悄悄重复计数。算不安全的数,它会直说,而不是猜一个给你。
-
开放标准,不绑定厂商
输入就是纯 OSI YAML,厂商中立,不用为哪家的私有语义层买单。
-
够快,原生支持 Arrow
精简的 Rust 引擎,内置进程内 DuckDB,结果以零拷贝的 Arrow 流式送进 DuckDB、 Polars 或 pyarrow。
-
接入方式随选
CLI、REST + Arrow 服务、 Python 绑定,同一个引擎,同样的答案。
-
为自动化而生
错误是结构化、机器可读的,带稳定错误码和修复建议,脚本和 AI Agent 据此就能自我纠正。
从这里开始¶
-
拿到
dosi可执行文件并验证,几分钟搞定,不用装数据库。 -
10 分钟动手教程,从一份模型走到能肉眼核对的真实结果。
-
OSI 是什么、语义层解决了什么问题,以及这些数字凭什么可信。
基于 Apache-2.0 开源。源码、issue 和设计文档都在 GitHub 上。