设计指标平台
需求
设计统一的指标管理平台,解决:
- 同一指标多处口径不一致
- 新指标开发周期长(依赖数据工程师)
- 指标缺乏文档和负责人
架构设计
指标模型
| 指标类型 | 定义 | 示例 |
|---|---|---|
| 原子指标 | 不可再拆的基础度量 | SUM(amount) |
| 派生指标 | 原子指标 + 维度 + 时间 | 近7天_APP端_GMV |
| 复合指标 | 多个指标运算 | 转化率 = 下单UV / 访问UV |
# 指标定义示例(YAML DSL)
metrics:
- name: gmv
display_name: 交易额
type: atomic
expression: SUM(payment_amount)
source_table: dwd_order_detail
filters:
- order_status = 'paid'
dimensions:
- channel
- category
- region
owner: analytics-team
tags: [核心指标, 交易]
核心模块
1. 指标注册中心
| 字段 | 说明 |
|---|---|
| 指标 ID | 全局唯一标识 |
| 指标名称 | 中文名 + 英文名 |
| 计算逻辑 | SQL 表达式 |
| 数据源 | DWD/DWS 表名 |
| 维度 | 支持下钻的维度列表 |
| 负责人 | 口径变更审批人 |
| 更新频率 | T+1 / 实时 / 小时级 |
2. 指标计算引擎
-- dbt 模型示例:物化指标
-- models/metrics/daily_gmv.sql
{{ config(materialized='incremental', unique_key='stat_date || channel') }}
SELECT
stat_date,
channel,
category,
region,
SUM(payment_amount) AS gmv,
COUNT(DISTINCT user_id) AS pay_users,
SUM(payment_amount) / COUNT(DISTINCT user_id) AS arpu
FROM {{ ref('dwd_order_detail') }}
WHERE order_status = 'paid'
{% if is_incremental() %}
AND stat_date >= (SELECT MAX(stat_date) FROM {{ this }})
{% endif %}
GROUP BY stat_date, channel, category, region
3. 指标查询 API
-- 语义层查询(类 Headless BI)
-- 用户只需指定"指标 + 维度 + 筛选条件"
SELECT
channel,
METRIC('gmv'),
METRIC('pay_users'),
METRIC('arpu')
WHERE
stat_date BETWEEN '2024-01-01' AND '2024-01-31'
AND region = '华东'
GROUP BY channel
常见面试问题
Q1: 如何解决指标口径不一致?
答案:
- 统一定义:所有指标在指标平台注册,唯一 SQL 口径
- 引用机制:BI 工具、报表、API 都从指标平台取数,不允许自建口径
- 变更审批:口径变更需负责人审批,自动通知下游消费者
- 版本管理:保留历史口径版本,支持回溯
Q2: 指标平台和 BI 工具的关系?
答案:
- 指标平台是语义层(定义指标 What),BI 工具是展示层(展示指标 How)
- 指标平台提供统一的指标计算结果,BI 工具消费这些结果做可视化
- 避免每个 BI 看板自己写 SQL 算指标(容易不一致)