本页介绍如何定义指标视图的核心组件:源、字段、度量值、筛选器和联接。
指标视图为数据创建语义层,将表和视图转换为标准化的业务指标。 他们定义要度量的内容、如何聚合它以及如何细分它,以便整个组织中的每个用户都报告相同的 KPI 值,消除不一致的报告,并跨任何字段实现灵活的分析。
有关联接、字段、度量值和代理元数据的完整示例,请参阅 教程:使用联接生成完整的指标视图。
核心组件
指标视图由以下元素组成:
| 组件 | 说明 | 示例 |
|---|---|---|
| 来源 | 包含数据的基表、视图或 SQL 查询。 | samples.tpch.orders |
| 字段 | 用于细分或分组指标的列属性。 | 产品类别、订单月份、客户区域 |
| 措施 | 用于生成指标的列聚合。 |
COUNT(o_orderkey) 作为订单计数, SUM(o_totalprice) 作为总收入 |
| 筛选器 | 应用于源数据以定义范围的条件。 |
|
| 联接 | 表、视图和指标视图之间的关系,以扩充数据。 | 使用 orders 表与 customers 表通过 customer_key 进行联接 |
定义源
可以使用类似表的资产或 SQL 查询作为指标视图的源。 您必须对任何引用的资产至少拥有SELECT权限。
类似表的资产是公开表格架构并支持SELECT查询的任何 Unity Catalog 对象,包括表、视图、物化视图、流式处理表、外部表、系统表和指标视图。
将类似表的资产用作源
若要将表格型资产用作源,请指定完全限定的名称。 例如: samples.tpch.orders。
将指标视图用作源
可以将现有指标视图用作新指标视图的源:
version: 1.1
source: views.examples.source_metric_view
fields:
- name: Order month
expr: '`Order Month`'
measures:
- name: Latest order month
expr: MAX(`Order month`)
- name: Latest order year
expr: "DATE_TRUNC('year', MEASURE(`Latest order month`))"
将指标视图用作源时,相同的可组合性规则适用于引用字段和度量值。 请参阅 “可组合性”。
使用 SQL 查询作为源
若要使用 SQL 查询,请直接在 YAML 中编写查询文本:
version: 1.1
source: SELECT * FROM samples.tpch.orders o LEFT JOIN samples.tpch.customer c ON o.o_custkey
= c.c_custkey
fields:
- name: Order key
expr: o_orderkey
measures:
- name: Order Count
expr: COUNT(o_orderkey)
注释
将 SQL 查询用作包含 JOIN 子句的源时,对基础表设置主键和外键约束,并使用 RELY 该选项来获得最佳查询性能。 请参阅声明主键、外键和唯一约束和使用主键和唯一约束进行查询优化。
Fields
字段是在查询时用于 SELECT、WHERE 和 GROUP BY 子句中的列。 每个表达式必须返回标量值。 字段可以引用源数据中的列或指标视图中以前定义的字段。 每个字段由两个组件组成:
-
name:列的别名 -
expr:引用指标视图中的源数据或以前定义的字段的 SQL 表达式
Warning
指标视图字段始终为 STRING,即使源列为 CHAR 或 VARCHAR。 在表格边界处应用的 CHAR(n) 空格填充会丢失,因此比较结果可能与源表不同。 例如,值 CHAR(10)'COLLEGE' 会存储为 'COLLEGE ',因此 column = 'COLLEGE' 在表中返回 true,而在指标视图字段中返回 false。
措施
度量值是在未预先确定聚合级别的情况下生成结果的表达式。 必须使用聚合函数来表示它们。 若要在查询中引用度量值,请使用函数 MEASURE 。 度量值可以引用源数据、早期定义的字段或早期定义的度量值中的基列。 每个度量值由以下组件组成:
-
name:度量值的别名 -
expr:可包含 SQL 聚合函数的聚合 SQL 表达式
以下示例演示了用于分析订单和收入数据的常见度量模式。 这些示例使用 TPC-H 订单表,其中包含销售交易数据,包括订单价格()、客户标识符(o_totalpriceo_custkey)、订单键(o_orderkey)、订单日期(o_orderdate)和优先级(o_orderpriority):
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 field
- name: Average Revenue per Month
expr: SUM(o_totalprice) / COUNT(DISTINCT DATE_TRUNC('MONTH', o_orderdate))
请参阅 聚合函数 获取聚合函数列表。
应用过滤器
YAML 定义中的筛选器适用于引用指标视图的所有查询。 以下示例演示如何将筛选器编写为布尔表达式:
# Single condition
filter: o_orderdate > '2024-01-01'
# Multiple conditions
filter: o_orderdate > '2024-01-01' AND o_orderstatus = 'F'
# IN clause
filter: o_orderstatus IN ('F', 'P') AND o_orderdate >= '2024-01-01'
处理联接
指标视图支持联接,以使用相关表中的属性丰富源数据。 您可以建模星型模式(事实表与维度表的连接)、雪花模式(多级维度连接)以及一对多关系 (从维度源扩展事实表)。 有关联接类型、基数、架构模式和限制的详细信息,请参阅 指标视图中的联接。
以下示例将 orders 事实数据表联接到 customer 维度表:
version: 1.1
source: samples.tpch.orders
joins:
- name: customer
source: samples.tpch.customer
on: source.o_custkey = customer.c_custkey
fields:
- name: Customer name
expr: customer.c_name
measures:
- name: Total revenue
expr: SUM(o_totalprice)
YAML 语法和格式设置
指标视图定义遵循标准 YAML 表示法语法。 有关所需语法和格式,请参阅 指标视图 YAML 语法参考 。
最佳做法
对指标视图进行建模时,请使用以下准则:
-
模型原子度量值:首先定义最简单的度量值(例如,
SUM(revenue)COUNT(DISTINCT customer_id))。 使用可组合性构建复杂的度量值。 -
标准化字段值:使用转换(如
CASE语句)将数据库代码转换为明确的业务名称(例如,将订单状态“O”转换为“打开”,将“F”转换为“履行”)。 - 使用筛选器定义范围:如果指标视图只应包含已完成订单,请在指标视图中定义该筛选器,以便用户不能意外包含不完整的数据。
-
使用明确的命名:指标名称应可识别给业务用户(例如,“客户生存期值”而不是
cltv_agg_measure)。 - 单独的时间字段:包括粒度时间字段(如“订单日期”)和截断的时间字段(如“订单月”或“订单周”),以支持详细级别和趋势分析。