代表性面试主题

数据工程面试:如何治理指标定义、粒度与 Join?

数据困难
OfferCC 编辑团队发布 更新

题干

不同报表中的 DAU、收入和转化率不一致。你会如何治理指标定义、实体粒度、时间窗口与 Join,防止重复计数并安全迁移口径?

题干与适用场景

公司里的 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、采用率和事故数,同时确认业务用户能解释结果。

公开来源

同类题目