本页介绍如何为指标视图建模以及使用这些视图的最佳做法。
指标视图有助于为数据创建语义层,将原始表转换为标准化的业务友好指标。 他们定义要度量的内容、如何聚合它以及如何细分它,确保整个组织中的每个用户针对同一关键绩效指标(KPI)报告相同的数字。 目标是为业务指标创建单一事实来源。
通过将数据建模为指标视图,可以抽象化复杂的 SQL、表结构和数据质量问题,使分析人员能够完全专注于分析。
核心组件
对指标视图建模涉及在源数据上定义以下元素:
| 组件 | Description | Example |
|---|---|---|
| 来源 | 包含原始事务数据的基表、视图或 SQL 查询。 | samples.tpch.orders |
| 尺寸 | 用于对指标进行分段或分组的列属性 | 产品类别、订单月份、客户区域 |
| 措施 | 生成指标的列聚合。 这些度量值是你通常报告的内容。 |
COUNT(o_order_id) 作为订单计数, SUM(o_total_price) 作为总收入。 |
| 筛选器 | 通过持久条件应用于源数据来定义范围。 |
|
定义源
可以使用类似表的资产或 SQL 查询作为指标视图的源。 若要使用类似表的资产,必须至少拥有对该资产的SELECT特权。
将表用作源
若要将表用作源,请包括完全限定的表名称,如以下示例所示。
source: samples.tpch.orders
使用 SQL 查询作为源
若要使用 SQL 查询,请直接在 YAML 中编写查询文本。
source: SELECT * FROM samples.tpch.orders o
LEFT JOIN samples.tpch.customer c
ON o.o_custkey = c.c_custkey
注释
使用包含 JOIN 子句的 SQL 查询作为源时,Databricks 建议在底层表中设置主键和外键约束,并在查询时酌情选择使用 RELY 选项,以实现最佳性能。 有关使用主键和外键约束的详细信息,请参阅 使用主键约束声明主键和外键关系 以及 查询优化。
将指标视图用作源
还可以使用现有指标视图作为新指标视图的源:
version: 1.1
source: views.examples.source_metric_view
dimensions:
# Dimension referencing dimension from source_metric_view
- name: Order date
expr: order_date_dim
measures:
# Measure referencing dimension from source_metric_view
- name: Latest order month
expr: MAX(order_date_dim_month)
# Measure referencing measure from source_metric_view
- name: Latest order year
expr: DATE_TRUNC('year', MEASURE(max_order_date_measure))
将指标视图用作源时,相同的可组合性规则适用于引用维度和度量值。 请参阅 “可组合性”。
尺寸
用于查询时SELECT、WHERE和GROUP BY子句中的列即为维度。 每个表达式必须返回标量值。 维度定义为数组。 每个维度由两个组件组成:
name:列的别名。expr:源数据上的 SQL 表达式,用于定义指标视图中的维度或以前定义的维度。
注释
从版本 1.1 开始,还可以为每个维度定义语义元数据(显示名称、格式和同义词)。 请参阅 指标视图中的语义元数据 以获取详细信息。
措施
度量值是定义为一组表达式的列,这些表达式在生成结果时不依赖于预先确定的聚合级别。 必须使用聚合函数来表示它们。 若要在查询中引用度量值,必须使用函数 MEASURE 。 度量值可以引用源数据或早期定义的维度中的基字段。 每个度量值由以下组件组成:
name:度量值的别名。expr:可以包含 SQL 聚合函数的聚合 SQL 表达式。
以下示例演示了常见的度量值模式:
measures:
# Simple count measure
- name: Order Count
expr: COUNT(1)
# Sum aggregation measure
- name: Total Revenue
expr: SUM(o_totalprice)
# Distinct count measure
- name: Unique Customers
expr: COUNT(DISTINCT o_custkey)
# Calculated measure combining multiple aggregations
- name: Average Order Value
expr: SUM(o_totalprice) / COUNT(DISTINCT o_orderkey)
# Filtered measure with WHERE condition
- name: High Priority Order Revenue
expr: SUM(o_totalprice) FILTER (WHERE o_orderpriority = '1-URGENT')
# Measure using a dimension
- name: Average Revenue per Month
expr: SUM(o_totalprice) / COUNT(DISTINCT DATE_TRUNC('MONTH', o_orderdate))
请参阅 聚合函数 获取聚合函数列表。
请参阅 measure 聚合函数。
注释
从版本 1.1 开始,还可以为每个度量值定义语义元数据(显示名称、格式和同义词)。 请参阅 指标视图中的语义元数据 以获取详细信息。
应用筛选器
指标视图的 YAML 定义中的筛选器适用于引用它的所有查询。 它必须编写为 SQL 布尔表达式,并且等效于在 SQL 查询中使用 WHERE 子句。
以下示例演示了常见的筛选器模式:
# Single condition filter
filter: o_orderdate > '2024-01-01'
# Multiple conditions with AND
filter: o_orderdate > '2024-01-01' AND o_orderstatus = 'F'
# Multiple conditions with OR
filter: o_orderpriority = '1-URGENT' OR o_orderpriority = '2-HIGH'
# Complex filter with IN clause
filter: o_orderstatus IN ('F', 'P') AND o_orderdate >= '2024-01-01'
# Filter with NOT
filter: o_orderstatus != 'O' AND o_totalprice > 1000.00
# Filter with LIKE pattern matching
filter: o_comment LIKE '%express%' AND o_orderdate > '2024-01-01'
还可以在查询或使用指标视图时添加筛选器。
高级建模功能
指标视图建模支持高级技术来创建复杂且高度可重用的指标。
联接
通过联接,可以使用相关表中的描述性属性来扩充指标视图。 可以使用联接对来自事实数据表到维度表(星型架构)的关系建模,并从维度表遍历到子维度表,从而允许在规范化维度表(雪花架构)之间进行多跃点联接。
请参阅 指标视图中的“使用联接”。
窗口测量
重要
此功能为试验性的。
利用窗口度量值,您可以在指标视图中通过窗口化、累积或半累加聚合来定义度量值。 这些类型的度量值允许更复杂的计算,例如移动平均值、期间内更改和运行总计。 请参阅在指标视图中使用窗口度量值,了解演示如何在指标视图中使用窗口度量值的示例。
可组合性
指标视图是可组合的,允许通过引用以前定义的元素来构建复杂的逻辑。 可以在新的维度中引用先前定义的维度,在新的度量值中引用任何维度或先前定义的度量值,并且在度量视图中引用定义的联接的列。
查看 指标视图中的可组合性。
语义元数据
语义元数据有助于使用工具了解如何显示和处理度量值和维度。 这包括以下属性:
| 语义元数据 | Example |
|---|---|
| 显示名称 |
Total Revenue 而不是 sum_o_price。 |
| 显示格式 | 标准化货币、百分比和日期的格式。 |
| 注释 | 使用自然语言解释指标的业务定义。 |
定义语义元数据时,它会随指标一起传输。 例如,当分析师在仪表板中使用 总收入 时,它会自动显示为货币。
请参阅 在指标视图中使用语义元数据。
YAML 语法和格式设置
指标视图定义遵循标准 YAML 表示法语法。 请参阅 YAML 语法参考 ,了解定义指标视图所需的语法和格式。 请参阅 YAML 规范 1.2.2 文档,了解有关 YAML 规范的详细信息。
窗口测量
窗口度量值在定义的 窗口内或与当前行相关的行区间上计算出一个值。 可以使用时间序列和比较分析的窗口度量值,从而定义指标,例如:
- 滚动 30 天总收入:过去 30 天内的收入总和
- 年到日(YTD)收入:从年初算起累计总和
- 上一期比较:上月收入
请参阅 度量视图中的“使用窗口度量值”。
对指标视图进行建模的最佳做法
对指标视图进行建模时,请使用以下准则:
-
模型原子度量值:首先定义最简单的非计算度量值(例如,
SUM(revenue)COUNT(DISTINCT customer_id))。 使用可组合性构建复杂的度量值(如 AOV)。 -
标准化维度值:使用转换(如
CASE语句或表达式)将神秘数据库代码转换为明确的业务名称(例如,将订单状态“O”转换为“打开”,将“F”转换为“履行”)。 - 使用筛选器定义范围:有意使用持久性筛选器。 如果指标视图只应包含已完成订单,请在指标视图中定义该筛选器,以便用户无法意外包含不完整的数据。
-
使用业务友好的命名:指标名称应当让业务用户能够立即识别(例如,客户生命周期价值与
cltv_agg_measure)。 - 单独的时间维度:始终包括精细的时间维度(如 订单日期)和截断的时间维度(如 Order Month 或 OrderWeek),以支持详细级别和趋势分析。