指标视图为数据创建语义层,将表和视图转换为标准化的业务指标。 它们定义要度量的内容、如何聚合它以及如何对其进行分段。 因此,整个组织中的每个用户都为相同的 KPI 报告相同的值,这样就消除了不一致的报告,并跨任何字段实现灵活的分析。
定义的核心组件是源、联接、筛选器、字段和度量值。
有关连接、字段、度量值和代理元数据的完整示例,请参阅 教程:使用连接和数据建模构建指标视图。
核心组件
指标视图由以下元素组成:
| 组件 | Description | 示例 |
|---|---|---|
| Source | 包含数据的基表、视图或 SQL 查询。 | samples.tpch.orders |
| 联接 | 表、视图和指标视图之间的关系,以扩充数据。 | 使用 orders 表与 customers 表通过 customer_key 进行联接 |
| 筛选器 | 应用于源数据以定义范围的条件。 |
|
| 字段 | 用于对指标进行分组、筛选和聚合的列。 包括分类列和未聚合的数字列。 也称为维度。 | 产品类别、订单月份、单价 |
| 措施 | 用于生成指标的列聚合。 |
COUNT(o_orderkey) 作为订单计数, SUM(o_totalprice) 作为总收入 |
定义源
可以使用类似表的资产或 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) 空间填充丢失,因此比较可能会返回不同的结果。 例如, column = 'COLLEGE' 匹配 CHAR(10) 源表中的值(已填充空格),但不在指标视图字段中。
措施
度量值是在未预先确定聚合级别的情况下生成结果的表达式。 必须使用聚合函数来表示它们。 若要在查询中引用度量值,请使用函数 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))
请参阅 聚合函数 获取聚合函数列表。
应用过滤器
筛选器适用于引用指标视图的所有查询。 若要在 UI 中定义筛选器,请参阅 步骤 3:定义筛选器。
若要在 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'
处理联接
指标视图支持联接,以使用相关表中的属性丰富源数据。 您可以建模星型模式(事实表与维度表的连接)、雪花模式(多级维度连接)以及一对多关系 (从维度源扩展事实表)。 有关联接类型、基数、架构模式和限制的详细信息,请参阅 指标视图中的联接。
若要在 UI 中定义联接,请参阅 步骤 2:添加联接。 若要在 YAML 定义中定义联接,请使用以下部分中的模式。
注释
联接表不能包含 MAP 类型列。 若要从 MAP 类型列解包值,请参阅 映射或数组中的“分解嵌套元素”。
模型星型架构
在星型架构中,source是事实数据表,并使用LEFT OUTER JOIN与一个或多个维度表连接。 指标视图根据所选字段和度量值联接特定查询所需的事实表和维度表。
使用 on 子句(布尔表达式)或 using 子句(共享列名)指定联接列。 该连接必须符合多对一关系。 在多对多关系的情况下,引擎会从联接后的维度表中选择第一条匹配的行。
以下示例将 orders (事实数据表)联接到 customer (维度表),并将客户属性公开为字段。 设置 rely.at_most_one_match: true 声明联接是多对一(每个订单只有一个客户),这允许引擎优化对联接表中字段进行筛选的查询。
Warning
仅在关系为多对一时设置 at_most_one_match: true 。 此属性在运行时未验证。 如果联接生成扇出,度量值将返回不正确的结果。
请参阅使用 rely 优化联接。
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)。 - 单独的时间字段:包括粒度时间字段(如“订单日期”)和截断的时间字段(如“订单月”或“订单周”),以启用详细级别和趋势分析。