题干与适用场景
公司里的 DAU、收入和转化率在不同报表中结果不一致。请设计一个语义层,让分析师、BI、应用和自动化任务共享受治理的指标定义。
回答应讨论指标契约、实体粒度、维度、join 图、时间语义、版本、权限、缓存、质量测试和迁移。题目不要求绑定 dbt 或 Looker;它们只是可参考的实现。结果差异是虚构练习场景,不代表某工具一定能解决。
面试官考察点
统一口径
候选人要把“指标名称”落实为分子、分母、过滤、时间窗、去重和默认维度,而不是只建一张宽表。
粒度与 join
要识别事实表粒度,防止多对多 join 重复计数,并说明不可组合的指标如何拒绝查询。
治理与变更
定义应进入版本控制、审查、弃用和兼容窗口,不能让 BI 用户随意复制 SQL 形成第二套口径。
可用性
语义层既要给机器可查询的契约,也要给人可读的说明、示例、所有者和质量状态。
回答前需要澄清的问题
- DAU、收入和转化率的业务定义分别是什么?
- 消费者需要 SQL、API、BI 探索还是嵌入式图表?
- 数据源的事实粒度和时区是什么?
- 是否允许近实时指标和最终修订值同时存在?
- 指标权限按用户、团队、行还是列控制?
- 旧报表需要多长兼容与迁移窗口?
30 秒回答框架
“我会把指标定义成版本化契约:名称、说明、分子分母、过滤、时间粒度、时区、实体粒度、维度、所有者、敏感级别和质量状态。查询引擎根据声明的 join 图生成 SQL,并在可能多对多或粒度不兼容时拒绝执行。
定义通过代码审查发布,保留旧版本和弃用期。消费端使用 API 或 BI 适配器,结果带定义版本和数据新鲜度。测试包括 fixture、总数对账、重复计数、延迟、权限和回归差异。”
分步骤深入解答
第一步:盘点使用场景
列出报表、告警、应用和实验分别需要的查询、延迟和精度。先选两三个高价值指标做试点,避免一次迁移所有 SQL。
第二步:定义契约
契约应包含 metric name、语义说明、measure、过滤、时间窗、时区、实体、维度、owner、敏感级别、版本和 freshness SLO。
第三步:建粒度与 join 图
明确每个模型的主键和粒度。只有声明为一对一或一对多且聚合方向安全的 join 才开放;多对多需要预聚合、桥接表或查询拒绝。
第四步:处理时间与修订
定义事件时间、处理时间、时区、迟到数据和最终修订。近实时结果应带 freshness 和是否 final 标志,不能把暂时值伪装成最终值。
第五步:发布和权限
指标定义存入版本库,经 owner 与数据质量审查后发布。权限控制数据集、维度和行列;审计谁查询了敏感指标。旧版本设迁移期限和弃用通知。
第六步:质量与消费
为每个指标建立 fixture、对账样本、join 重复检查、freshness、null 和分布测试。通过 SQL API、BI adapter 或 embedded endpoint 返回结果、版本、时区和质量状态。
高质量示范回答
“我先挑 DAU 和收入两个指标做试点。每个定义记录分子、分母、过滤、事件时间、时区、实体粒度、允许维度、owner、敏感级别、版本和 freshness。DAU 明确是去重用户还是设备;收入明确确认时间、退款和税费处理。
语义层维护模型粒度和 join 图,只允许安全的聚合路径;多对多 join 要预聚合或拒绝。定义通过 Git 审查和自动测试后发布,旧版本在窗口内继续可用,查询结果返回定义版本和数据新鲜度。权限覆盖数据集与维度,敏感访问写审计日志。
验证包括样本对账、重复计数、迟到数据、时区、权限、freshness 和历史回归。迁移从高价值报表开始,比较新旧结果并记录可解释差异,而不是直接重写所有 SQL。”
常见错误
- 只保存指标名称,不保存分子分母和过滤。
- 用宽表掩盖不同事实粒度。
- 允许任意 join,造成多对多重复计数。
- 把事件时间、处理时间和时区混在一起。
- 没有版本、owner、弃用和迁移窗口。
- 只测 SQL 成功,不测结果对账和 freshness。
- 只做 BI 插件,不提供机器可读契约。
- 权限只放在仪表盘,不覆盖底层维度和查询审计。
追问及应对
追问一:如何防止收入被重复计算?
先声明收入事实粒度和唯一键,在 join 前按目标实体预聚合;对多对多路径拒绝或要求桥接模型,并用已知样本做总额对账。
追问二:指标定义变更会破坏下游吗?
使用新版本或兼容字段,保留旧版本和弃用日期。查询响应带版本,下游可以逐步迁移,变更需要 owner 和消费者批准。
追问三:近实时和最终值如何共存?
返回值、freshness、watermark 和 final 状态。消费者必须选择允许的延迟与修订语义,不能把临时值当作最终财务数字。
追问四:如何做指标权限?
按数据集、行、列和维度组合授权,敏感指标最小权限;记录查询者、定义版本和导出动作,定期审计。
追问五:如何证明语义层有价值?
比较迁移前后的定义冲突数、重复 SQL、对账差异、查询成功率、freshness、采用率和事故数,同时确认业务用户能解释结果。