☰
Apache Ossie 把聚合函数分成三类:语义层性能的表达式语言关键
2026/10/21 2:03:15 网站建设 项目流程

Apache Ossie 把聚合函数分成三类:语义层性能的表达式语言关键

【免费下载链接】ossieApache Ossie, industry wide specification effort to standardize how we exchange semantic metadata across analytics, AI and BI platforms, providing a vendor neutral, single source of truth for semantic data项目地址: https://gitcode.com/GitHub_Trending/osi1/ossie

Apache Ossie 是 Apache 基金会推动的跨厂商语义元数据交换行业标准,其表达式语言是一套用于声明指标、字段与过滤器的可移植 SQL 子集。本文从一个工程痛点切入——"亿级明细上的COUNT(DISTINCT)为什么撞上聚合墙"——说明这套语言如何给函数分级、给聚合分类、用方言机制吸收数据库差异,让语义层的性能优化有确定性的依据。

明细表上的聚合墙:语义层为什么需要一套统一表达式语言

本节回答的问题是:聚合指标跑在明细数据上时,瓶颈到底出在哪,而表达式语言在这套架构里处在什么位置?

瓶颈通常出在两个地方。其一,COUNT(DISTINCT)、MEDIAN这类函数无法"先分片再合并"——引擎必须把所有明细握在手里或做全局排序才能作答,查询成本随行数线性上涨;其二,多个 BI 工具各自为同一个业务指标拼写自己的聚合 SQL,口径漂移是迟早的事。Apache Ossie 的解法是在语义层定义统一表达式语言:它目前只服务于逻辑层(Logical Layer)——也就是指标、字段、过滤器所在的层;其上是本体层(语言仍在定义中,单独立项),其下是各数据库的原生 SQL。核心语法以 ANSI SQL:2003(ISO/IEC 9075-2:2003)为基,理由是其语义定义清晰,且被 Snowflake、Databricks、BigQuery 等主流仓库广泛采用。

设计原则有四条:可移植性——核心函数在所有合规实现里行为一致;熟悉度——基于广泛采用的 SQL 语法;分析聚焦——BI 高频函数优先;可扩展性——厂商方言可以在核心之外扩展。规范同时划清了边界:这套语言只管辖"声明模型",不定义查询接口,给表达式追加一个方言,并不代表引擎会用该方言执行查询。

可分解性把 Ossie 聚合函数分成四类:哪些能预聚合,哪些必须全量

这里要回答的是:引擎拿到一个聚合函数后,凭什么判断它能否走"先分片、后合并"的执行路径?

判据叫做可分解性(Decomposability),只问一个问题:能否先在各分片上算出中间结果、再合并?规范据此把聚合函数分成四类:

类别代表函数合并行为
DistributiveSUM、COUNT、MIN、MAX分片结果直接相加 / 比较,零误差
AlgebraicAVG、STDDEV、VARIANCE需保留总和、行数等中间量,合并时做一次公式换算
HolisticCOUNT(DISTINCT)、MEDIAN、PERCENTILE分片结果不可合并,必须全量扫描
SketchAPPROX_COUNT_DISTINCT、APPROX_PERCENTILE用可合并的概率草图结构近似

用连锁餐厅的月度对账来理解:各分店先核对自己的日结余额(SUM干的事),总部把各店余额相加即可,这类指标可以毫无损失地压进任何一张预聚合表;但"全部门店哪道菜的中位评分最高",看各店的中位数没有答案,只能回到原始点评明细。这就是 Holistic 与前两类的分界。🎯 对引擎而言,这套分类是编译期的调度依据:按函数类别自动选择"预聚合 + 合并"或"全量扫描"的执行路径,也为多阶段聚合扩展预留了接口。完整函数清单与精度说明见core-spec/expression_language.md。

在 TPC-DS 语义模型里落地三个真实指标

本节回答的问题很具体:聚合指标在语义模型的 YAML 里究竟长什么样。

指标定义在模型层级,可以引用多个数据集的字段。仓库内置的 examples/tpcds_semantic_model.yaml 里有三组对照鲜明的写法:total_sales是单个SUM(store_sales.ss_ext_sales_price),纯 Distributive,最容易被预聚合吃掉;customer_lifetime_value是SUM(...) / COUNT(DISTINCT customer.c_customer_sk),分子可分片、分母必须全量,执行计划的瓶颈完全取决于后者;store_productivity则示范了比率指标的防御式写法:

- name: store_productivity expression: dialects: - dialect: ANSI_SQL expression: SUM(store_sales.ss_ext_sales_price) / NULLIF(SUM(store.s_number_employees), 0) datatype: Decimal

NULLIF(x, 0)把除零变成 NULL 而不是报错,是写比率指标的默认姿势。需要在聚合内部限定条件时,规范的做法是条件聚合:SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END),它与任意GROUP BY都能自由组合,不必为过滤条件单独造中间表。

dialects 声明:同一个指标如何在 Snowflake 和 BigQuery 上分别正确

本节回答:同一份模型文件,如何在不同引擎上生成正确的 SQL,而不需要为每个引擎 fork 一版模型?

答案是dialects数组:一个表达式的每个条目声明一个方言版本,规范把OSSIE_SQL_2026注册为未指定时的默认方言。差异最集中的是参数顺序与函数命名:

dialects: - dialect: ANSI_SQL expression: DATE_TRUNC('month', order_date) - dialect: BIGQUERY expression: DATE_TRUNC(order_date, MONTH)
场景ANSI_SQLBigQuery
截断到月DATE_TRUNC('month', d)DATE_TRUNC(d, MONTH)
日期加 7 天DATEADD(day, 7, d)DATE_ADD(d, INTERVAL 7 DAY)

处理规则同样被写进规范:Ossie 方言是必须支持的,其余方言 MAY 被实现忽略,但当一个表达式声明了多个方言时,实现必须确定性地选定其中一个——同一模型在同一引擎上永远得到同一行为。"业务定义只写一次、引擎差异由声明吸收",正是厂商中立单一事实来源的落点。从 BI 工具迁移的读者还有一张现成映射:COUNT(DISTINCT x)对应 Tableau 的COUNTD(x)与 DAX 的DISTINCTCOUNT(x),聚合、日期、字符串函数的完整对照在core-spec/expression_language.md的 Cross-Reference 章节;注意两处隐含语义差——DAX 的COUNT(x)实际对应COUNTA,且 DAX 的DISTINCTCOUNT会计入空值,SQL 版本则排除 NULL。

近似函数与分位数函数:大表场景的第二性能杠杆

本节回答:当明细从千万行涨到亿级行,哪些指标该换算法?

规范的答案是近似聚合,标注为 RECOMMENDED 而非强制:APPROX_COUNT_DISTINCT(customer_id)用 HyperLogLog 类概率草图估算去重用户,典型误差约 2%;APPROX_PERCENTILE(response_time, 0.95)用 t-digest 类结构估算 P95,误差约 1%。草图结构天然可合并、天然适合分布式计算——像地铁口的客流感应器只统计一部分进出就报出总客流,用十分之一的成本换到百分之九十八的答案。⚡

精度侧,分位数函数族是必选支持:MEDIAN(expr)即第 50 百分位,PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY expr)返回插值,PERCENTILE_DISC返回真实数据值,p取 0 到 1 之间。统计函数族(STDDEV、VARIANCE及总体版STDDEV_POP、VAR_POP,别名STDDEV_SAMP、VAR_SAMP)同属 Algebraic,引擎只需保留中间量即可合并。

把三条线索收拢起来:函数分级(REQUIRED / RECOMMENDED)决定哪些能力可以依赖,可分解性决定指标该走哪条执行路径,dialects决定 SQL 在每个引擎上如何生成——性能优化由此从经验猜测变成一套有规则可依的决策过程。

【免费下载链接】ossieApache Ossie, industry wide specification effort to standardize how we exchange semantic metadata across analytics, AI and BI platforms, providing a vendor neutral, single source of truth for semantic data项目地址: https://gitcode.com/GitHub_Trending/osi1/ossie

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询