首页 / 资讯中心 / 文章详情

如何用 Apache Ossie 表达式语言写好聚合函数:可分解性与语义层性能优化完整指南

如何用 Apache Ossie 表达式语言写好聚合函数:可分解性与语义层性能优化完整指南 ★ FEATURED ARTICLE
如何用 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如果你的语义层里某个指标对不上报表或者一次分位数查询在几亿行数据上跑了很久问题可能不在模型、也不在数据库而藏在一个长期被低估的概念里——可分解性Decomposability。本文以 Apache Ossie 的表达式语言为线索用聚合函数做例子讲清楚分片结果能不能合并这一个判断如何改变语义层的执行方式与优化空间。同一个指标为什么有的跑得快、有的对不上这种场景你可能遇到过同一个客单价基于预聚合表的版本秒级返回全量扫描的版本要跑十几分钟或者两个版本给出的数字本身就不一致。排查时大家常归因于数据脏或引擎慢但往深里挖往往缺一个明确答案这个聚合能不能先按片算、再把片的结果合起来这正是 Apache Ossie 表达式语言里被认真对待的概念。像 SUM 这类聚合分片算完可以直接合并引擎可以放心走预聚合 合并的路线像 MEDIAN 这类聚合分片结果根本拼不出整体结果任何引擎都只能回到明细逐行算。一个指标可优化的空间有多大很大程度上取决于它用到的函数落在哪个类别里。三大可分解性用分片能不能合并来分先给一个朴素定义可分解性回答的问题是——数据切成几份、每份先算出中间结果之后能不能直接得到最终答案按回答的不同Ossie 把聚合函数划成三大类再加一类概率式的第四类。Distributive可直接合并SUM 最典型。把一年的数据按月切开12 个月各自求和再把 12 个数相加就是全年总和零误差。COUNT、COUNT(*)、MIN、MAX 同理分片算完照单合并即可。Algebraic中间量换算后合并两个月各自的订单均值不能直接再平均——因为两个月单量不同。但每片多留一份总和 行数整体均值就能精确算出来。AVG、STDDEV、VARIANCE 都属此类合并时要多做一步公式换算。Holistic合不了只能全量算两半数据各自的 P95 响应时间取平均不等于整体的 P95两半各自的中位数也一样拼不出整体中位数。MEDIAN、PERCENTILE 系函数、COUNT(DISTINCT) 都在这一档无论怎么切分最终都要回明细一次算清。Sketch-based合并草图结构第四类不走精确路线合并的是一份紧凑的概率草图sketch结果带误差但可高效合并天然适配分布式计算。类别一旦确定引擎就不再需要无脑全量扫描可以按函数类别挑选先分片预聚合、再合并或直接扫明细的执行路径——这就是 Ossie 规划中的多阶段聚合扩展Analytical Context Extension所依赖的基础。按可分解性归组的聚合函数图谱有了类别标签函数清单就按类来排而不是按 SUM、AVG、分位数这样的家族排。除特别注明外以下函数均为 Ossie 合规实现必须支持REQUIRED。Distributive 组SUM / COUNT / MIN / MAXSUM(expr)求和COUNT(expr)数非空值COUNT(*)数总行数MIN(expr)、MAX(expr)取极值。注意COUNT(DISTINCT expr)虽然长得像 COUNT但归在 Holistic 组——去重信息分片后无法拼回。Algebraic 组AVG 与统计函数族AVG(expr)算术平均STDDEV/STDDEV_POP/STDDEV_SAMP样本与总体标准差VARIANCE/VAR_POP/VAR_SAMP样本与总体方差。这一组的共同点是合并时需要的不是结果本身而是一组中间量总和、平方和、行数之类换算一步得到精确值。Holistic 组分位数与去重MEDIAN(expr)即第 50 百分位PERCENTILE_CONT(p) WITHIN GROUP (ORDER BY expr)给连续插值分位PERCENTILE_DISC(p) WITHIN GROUP (ORDER BY expr)给离散真实存在分位p取 0 到 1 之间的值。COUNT(DISTINCT expr)也在这里。它们是唯一分片必死的一档。同一条主线从精确 Holistic 到草图近似当数据量到了亿级精确的COUNT(DISTINCT)和精确分位数往往是成本瓶颈。Ossie 推荐RECOMMENDED支持的近似聚合提供了另一条路APPROX_COUNT_DISTINCT(expr)HyperLogLog 之类的草图近似去重计数典型误差约 2%APPROX_PERCENTILE(expr, p)t-digest 之类的草图近似分位典型误差约 1%它们和 Holistic 组解决的是同一个问题差别在于草图结构本身可合并于是分片 合并这条路重新走得通。精确与近似其实是同一条用可合并性换性能主线上精度与开销的两个刻度。两个必选的配套能力DISTINCT 修饰SUM 与 COUNT 支持SUM(DISTINCT amount)、COUNT(DISTINCT customer_id)这种去重写法条件聚合用CASE WHEN表达带过滤的聚合一行就能只统计已完成订单的金额——SUM(CASE WHEN status completed THEN amount ELSE 0 END)表达式语言在哪逻辑层与四条设计原则前面都在讲函数本身这里补上它所处的位置。Ossie 的语义模型分三层表达式语言负责的是中间那层Ontological Layer本体层面向业务概念建模语言尚在定义中Logical Layer逻辑层对应传统 BI 语义模型使用 Ossie SQL 表达式语言指标metrics、字段fields、过滤器filters都写在这一层Physical物理层各数据库自己的原生 SQL设计上有四条原则可移植——核心函数在所有实现里行为一致熟悉——基于被广泛采用的 SQL 语法与语义分析聚焦——BI 与数据分析常用函数优先可扩展——厂商方言可以在核心之上扩展。语法底座选的是 ANSI SQL:2003 核心标准ISO/IEC 9075-2:2003原因很实际Snowflake、Databricks、BigQuery、PostgreSQL 等主流数据库都支持且语义定义清晰。还有一个边界值得注意这套语言服务于声明模型即书写指标、字段、过滤器它不定义查询接口。给指标声明了一个方言并不意味着可以用那个方言发起查询。实战多方言的指标表达式怎么写聚合函数最终落在语义模型的 metrics 里指标定义在模型层级可以跨多个数据集。看仓库自带的 TPC-DS 示例 examples/tpcds_semantic_model.yaml人均销售额这个指标用两个 SUM 相除再用NULLIF挡住除零metrics: - 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三个要点。第一dialects是个数组同一个指标可以并列 ANSI_SQL、SNOWFLAKE、BIGQUERY 等版本不同引擎参数顺序或函数名有差异时各声明一份核心语义保持一致。第二聚合可以互相组合SUM(...) / COUNT(DISTINCT ...)就是客单价比值类、人均类业务指标基本都靠算术拼出来。第三NULLIF(x, 0)是防御性习惯分母为零时返回 NULL 而不是触发除零错误写比率指标时建议默认带上。条件聚合同样可以直接嵌进指标表达式例如只统计已完成订单的销售额见上一节的CASE WHEN一行即可。从 Tableau 或 DAX 迁移函数映射小对照规范自带了常见 BI 工具的函数映射表挑高频的几行方便速查Ossie 标准TableauDAXCOUNT(DISTINCT x)COUNTD(x)DISTINCTCOUNT(x)AVG(x)AVG(x)AVERAGE(x)STDDEV(x)STDEV(x)STDEV.S(x)VARIANCE(x)VAR(x)VAR.S(x)PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY x)PERCENTILE(x, 0.75)PERCENTILE.INC(x, 0.75)从 DAX 迁移时有一个坑要留意SQL 的 NULL 和 DAX 的 BLANK 不是一回事。因此COUNT(x)实际对应COUNTA而非COUNTCOUNT(DISTINCT x)对应的是DISTINCTCOUNTNOBLANK——DISTINCTCOUNT会把 BLANK 当成一个取值计入可空列上会差一。完整的聚合、日期、字符串、窗口函数对照都在 core-spec/expression_language.md 的 Cross-Reference 章节。三句话带走先分类再谈优化Distributive 直接合并、Algebraic 留中间量换算、Holistic 只能全量计算——聚合函数的类别决定了指标在语义层里有多少执行空间。近似是合规的优化手段数据量大时APPROX_COUNT_DISTINCT、APPROX_PERCENTILE 用几个百分点的误差换量级上的提速草图结构天然可合并。核心统一、差异交给方言核心函数跨厂商行为一致引擎差异用dialects声明吸收这正是厂商中立的单一事实来源的落点。想动手的话从 examples/tpcds_semantic_model.yaml 这个示例模型入手再用 validation/ 目录下的工具校验你自己的语义模型表达式语言的完整规范在 core-spec/expression_language.md。【免费下载链接】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),仅供参考
阅读完成 · 觉得有帮助?
咨询建站