通过

指标视图 YAML 语法参考

本页介绍指标视图的完整 YAML 语法。 指标视图定义遵循标准 YAML 表示法语法。

有关每项功能的最小运行时和 YAML 规范版本要求,请参阅 指标视图功能可用性

请参阅 YAML 规范 1.2.2 文档,了解有关 YAML 规范的详细信息。

YAML 概述

指标视图的 YAML 定义包括以下顶级字段:

领域 必需 类型 说明
version 必需 String 指标视图规范的版本。 请参阅 YAML 规范版本
comment 可选 String 指标视图的说明。
source 必需 String 指标视图的源数据。 可以是任何类似表的 Unity 目录资产,包括指标视图或 SQL 查询。 请参阅
filter 可选 String 适用于所有查询的 SQL 布尔表达式。 请参阅 筛选器
joins 可选 数组 星型架构和雪花架构联接。 请参阅 “联接”。
dimensions 有條件的 数组 维度定义,包括名称、表达式和可选语义元数据。 如果未 measures 指定,则为必需。 请参阅 维度
measures 有條件的 数组 度量值定义,包括名称、聚合表达式和可选的语义元数据。 如果未 dimensions 指定,则为必需。 请参阅 度量值
materialization 可选 对象 使用具体化视图加速查询的配置。 包括刷新计划和具体化视图定义。 请参阅 具体化

来源

source 字段指定指标视图的数据源。 可以使用类似表的资产,例如表、视图和指标视图,或将 SQL 查询用作源。 可组合性适用于指标视图。 将指标视图用作源时,可以在新的指标视图中引用其维度和度量值。 请参阅 “可组合性”。

类似表的资产源

使用表式资产的三部分名称引用类似表的资产:

source: catalog.schema.source_table

SQL 查询源

若要使用 SQL 查询,请直接在 YAML 中编写查询文本:

source: SELECT * FROM samples.tpch.orders o
  LEFT JOIN samples.tpch.customer c
  ON o.o_custkey = c.c_custkey

注释

将 SQL 查询用作包含 JOIN 子句的源时,对基础表设置主键和外键约束,并使用 RELY 该选项来获得最佳查询性能。 有关详细信息,请参阅 使用主键约束声明主键和外键关系 以及 查询优化

筛选器

YAML 定义中的筛选器适用于引用指标视图的所有查询。 将筛选器编写为 SQL 布尔表达式。

# 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'

联接

指标视图中的联接支持从事实数据表到维度表(星型架构)和跨规范化维度表的多跃点联接(雪花架构)。 还可以使用 SELECT 语句联接到 SQL 查询。 请参阅 将 SQL 查询用作源

注释

联接表不能包含 MAP 类型列。 若要从 MAP 类型列解包值,请参阅 映射或数组中的“分解嵌套元素”。

每个联接定义包括以下字段:

领域 必需 类型 说明
name 必需 String 联接表或 SQL 查询的别名。 在维度或度量值中引用联接表中的列时,请使用此别名。
source 必需 String 要联接的表的三部分名称。 也可以是 SQL 查询。
on 有條件的 String 定义联接条件的布尔表达式。 using如果未指定,则为必需。
using 有條件的 数组 父表和联接表中的列名列表。 on如果未指定,则为必需。
joins 可选 数组 雪花架构建模的嵌套联接定义列表。 有关最低运行时要求,请参阅 指标视图功能可用性

星型架构联接

在星型架构中,source是事实数据表,并使用LEFT OUTER JOIN与一个或多个维度表连接。 指标视图根据所选列联接特定查询所需的事实表和维度表。

使用 ON 子句或 USING 子句指定联接列:

  • ON 子句:使用布尔表达式定义联接条件。
  • USING 子句:列出父表和联接表中具有相同名称的列。

联接应遵循多对一关系。 在多对多关系的情况下,从联接维度表中选择第一个匹配的行。

version: 1.1
source: samples.tpch.lineitem

joins:
  - name: orders
    source: samples.tpch.orders
    on: source.l_orderkey = orders.o_orderkey

  - name: part
    source: samples.tpch.part
    on: source.l_partkey = part.p_partkey

dimensions:
  - name: Order Status
    expr: orders.o_orderstatus

  - name: Part Name
    expr: part.p_name

measures:
  - name: Total Revenue
    expr: SUM(l_extendedprice * (1 - l_discount))

  - name: Line Item Count
    expr: COUNT(1)

注释

命名空间 source 引用指标视图源中的列,而联接引用该联接表中的 name 列。 例如,在中source.l_orderkey = orders.o_orderkeysource,引用lineitemorders引用联接表。 如果未在子句中 on 提供前缀,则引用默认为联接表。

Snowflake 架构联接

雪花架构通过标准化维度表并将其连接到子维度来扩展星型架构。 这会创建多级联接结构。 有关最低运行时要求,请参阅 指标视图功能可用性

若要定义雪花架构,请在父联接定义内嵌套 joins

version: 1.1
source: samples.tpch.orders

joins:
  - name: customer
    source: samples.tpch.customer
    'on': o_custkey = c_custkey
    joins:
      - name: nation
        source: samples.tpch.nation
        'on': c_nationkey = n_nationkey

dimensions:
  - name: customer_nation
    expr: customer.nation.n_name

尺寸

用于查询时SELECTWHEREGROUP BY子句中的列即为维度。 每个表达式必须返回标量值。 维度可以引用源数据中的列或指标视图中早期定义的维度。

每个维度定义包括以下字段:

领域 必需 类型 说明
name 必需 String 维度的列别名。
expr 必需 String 可以引用源数据或以前定义的维度中的列的 SQL 表达式。
comment 可选 String 维度的说明。 显示在 Unity 目录和文档工具中。
display_name 可选 String 可视化工具中显示的人工可读标签。 限制为 255 个字符。 需要 YAML 规范 1.1。 请参阅 指标视图功能可用性
format 可选 地图 如何显示值的格式规范。 需要 YAML 规范 1.1。 请参阅 格式规范
synonyms 可选 数组 用于发现维度的 LLM 工具的替代名称。 最多 10 个同义词,每个同义词限制为 255 个字符。 需要 YAML 规范 1.1。 请参阅 同义词

例:

dimensions:
  # Basic dimension
  - name: order_date
    expr: o_orderdate
    comment: 'Date the order was placed'
    display_name: 'Order Date'

  # Dimension with SQL expression
  - name: order_month
    expr: DATE_TRUNC('MONTH', o_orderdate)
    display_name: 'Order Month'

  # Dimension with synonyms
  - name: order_status
    expr: CASE
      WHEN o_orderstatus = 'O' THEN 'Open'
      WHEN o_orderstatus = 'P' THEN 'Processing'
      WHEN o_orderstatus = 'F' THEN 'Fulfilled'
      END
    display_name: 'Order Status'
    synonyms: ['status', 'fulfillment status']

措施

度量值是在未预先确定聚合级别的情况下生成结果的表达式。 必须使用聚合函数来表示它们。 若要在查询中引用度量值,请使用函数 MEASURE 。 度量值可以引用源数据、早期定义的维度或早期定义的度量值中的基字段。

每个度量值定义包括以下字段:

领域 必需 类型 说明
name 必需 String 度量值的别名。
expr 必需 String 包含 SQL 聚合函数的聚合 SQL 表达式。
comment 可选 String 度量值的说明。 显示在 Unity 目录和文档工具中。
display_name 可选 String 可视化工具中显示的人工可读标签。 限制为 255 个字符。 需要 YAML 规范 1.1。 请参阅 指标视图功能可用性
format 可选 地图 如何显示值的格式规范。 需要 YAML 规范 1.1。 请参阅 格式规范
synonyms 可选 数组 用于发现度量值的 LLM 工具的替代名称。 最多 10 个同义词,每个同义词限制为 255 个字符。 需要 YAML 规范 1.1。 请参阅 指标视图功能可用性
window 可选 数组 窗口规范,用于窗口聚合、累积聚合或半累加聚合。 如果未指定,则度量值的行为为标准聚合。 请参阅 窗口度量值

请参阅 聚合函数 获取聚合函数列表。

例:

measures:
  # Simple count measure
  - name: order_count
    expr: COUNT(1)
    display_name: 'Order Count'

  # Sum aggregation measure with synonyms
  - name: total_revenue
    expr: SUM(o_totalprice)
    comment: 'Gross revenue from all orders'
    display_name: 'Total Revenue'
    synonyms: ['revenue', 'total sales']

  # Distinct count measure
  - name: unique_customers
    expr: COUNT(DISTINCT o_custkey)
    display_name: 'Unique Customers'

  # Calculated measure combining multiple aggregations
  - name: avg_order_value
    expr: SUM(o_totalprice) / COUNT(DISTINCT o_orderkey)
    display_name: 'Avg Order Value'
    synonyms: ['AOV', 'average order']

  # Filtered measure with WHERE condition
  - name: open_order_revenue
    expr: SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'O')
    display_name: 'Open Order Revenue'
    synonyms: ['backlog', 'outstanding revenue']

窗口测量

重要

此功能为试验性的

window 字段定义度量值的窗口化、累积聚合或半累加聚合。 有关窗口度量值和用例的详细信息,请参阅 Window 度量值

每个窗口规范包括以下字段:

领域 必需 类型 说明
order 必需 String 确定窗口排序的维度。
range 必需 String 窗口的范围。 支持的值:
  • current:窗口排序值等于当前行值的行。
  • cumulative:窗口排序值小于或等于当前行值的所有行。
  • trailing <value> <unit>:当前行中的行按指定的时间单位(例如, trailing 7 day) 向后移动的行。 不包括当前单元。
  • leading <value> <unit>:按指定时间单位(例如, leading 3 month)前进当前行中的行。 不包括当前单元。
  • all:无论窗口排序值如何,所有行。
semiadditive 必需 String 聚合方法。 支持的值:firstlast

窗口度量示例

以下示例计算唯一客户的滚动 7 天计数:

version: 1.1
source: samples.tpch.orders

dimensions:
  - name: order_date
    expr: o_orderdate

measures:
  - name: rolling_7day_customers
    expr: COUNT(DISTINCT o_custkey)
    display_name: '7-Day Rolling Customers'
    window:
      - order: order_date
        range: trailing 7 day
        semiadditive: last

物化

重要

此功能为试验性的

materialization 字段使用具体化视图配置自动查询加速。 有关具体化的工作原理、要求和最佳做法的详细信息,请参阅 指标视图的具体化

materialization 字段包括以下顶级字段:

领域 必需 类型 说明
schedule 必需 String 刷新计划。 对 具体化视图使用与 schedule 子句相同的语法。 不支持 TRIGGER ON UPDATE 子句。
mode 必需 String 必须设置为 relaxed
materialized_views 必需 数组 要具体化的具体化视图的列表。 每个条目都需要下面所述的字段。

每个 materialized_views 条目都包含以下字段:

领域 必需 类型 说明
name 必需 String 具体化的名称。
type 必需 String 具体化类型。 支持的值: aggregated (需要 dimensionsmeasures两者)或 unaggregated
dimensions 有條件的 数组 要具体化的维度名称列表。 如果需要typeaggregated且未measures指定,则为必需。
measures 有條件的 数组 要具体化的度量值名称列表。 如果需要typeaggregated且未dimensions指定,则为必需。

具体化示例

以下示例定义具有多个具体化的指标视图:

version: 1.1
source: samples.tpch.orders

dimensions:
  - name: order_date
    expr: o_orderdate
  - name: order_status
    expr: o_orderstatus

measures:
  - name: total_revenue
    expr: SUM(o_totalprice)
  - name: order_count
    expr: COUNT(1)

materialization:
  schedule: every 6 hours
  mode: relaxed
  materialized_views:
    - name: baseline
      type: unaggregated

    - name: daily_status_metrics
      type: aggregated
      dimensions:
        - order_date
        - order_status
      measures:
        - total_revenue
        - order_count

列名引用

在 YAML 表达式中引用包含空格或特殊字符的列名时,请将列名括在反引号中以转义空格或字符。 如果表达式以反引号开头,并且直接用作 YAML 的值,请将整个表达式括在双引号中。 有效的 YAML 值不能以反引号开头。

格式示例

使用以下示例了解如何在常见方案中正确设置 YAML 的格式。

引用列名称

下表显示如何根据列名称包含的字符设置列名称的格式。

案例 源列名称 引用表达式 备注
无空格 revenue expr: "revenue"
expr: 'revenue'
expr: revenue
对列名使用双引号、单引号或无引号。
带空格 First Name expr: "`First Name`" 使用反引号转义空格。 将整个表达式括在双引号中。
SQL 表达式中带有空格的列名 First NameLast Name expr: CONCAT(`First Name`, , `Last Name`) 如果表达式不以反引号开头,则不需要使用双引号。
源列名称中包含引号 "name" expr: '`"name"`' 使用反引号转义列名中的双引号。 将表达式括在 YAML 定义中的单引号中。

将表达式与冒号一起使用

案例 表达式 备注
带有冒号的表达式 expr: "CASE WHEN `Customer Tier` = 'Enterprise: Premium' THEN 1 ELSE 0 END" 用双引号包装整个表达式,以便正确解释

注释

YAML 将无引号冒号解释为键值分隔符。 始终对包含冒号的表达式使用双引号。

多行缩进

案例 表达式 备注
多行缩进 expr: \|
CASE WHEN
revenue > 100 THEN 'High'
ELSE 'Low'
END
将表达式缩进第一行

注释

|之后使用expr: 块标量以处理多行表达式。 为了正确解析,所有行必须在 expr 键之外至少缩进两个空格。

将 YAML 升级到 1.1

将指标视图升级到 YAML 规范版本 1.1 需要小心,因为注释的处理方式与早期版本中的处理方式不同。

批注类型

  • YAML 注释 (#):使用 #符号直接在 YAML 文件中编写的内联或单行注释。
  • Unity Catalog 注释:Unity Catalog 中存储的指标视图或其列(维度和度量值)的注释。 这些注释与 YAML 注释不同。

升级注意事项

选择与在指标视图中处理注释的方式匹配的升级路径。 以下选项描述了可用的方法并提供示例。

选项 1:使用笔记本或 SQL 编辑器保留 YAML 注释

如果指标视图包含要保留的 YAML 注释(#),请使用以下步骤:

  1. 使用 ALTER VIEW 命令在笔记本或 SQL 编辑器中。
  2. 将原始 YAML 定义复制到之后$$..$$AS节中。 将 version 的值更改为 1.1
  3. 保存指标视图。
ALTER VIEW metric_view_name AS
$$
# The notebook preserves inline comments
version: 1.1
source: samples.tpch.orders
dimensions:
- name: order_date # The notebook preserves inline comments
  expr: o_orderdate
measures:
# The notebook preserves commented out definitions
# - name: total_orders
# expr: COUNT(o_orderid)
- name: total_revenue
  expr: SUM(o_totalprice)
$$

警告

运行 ALTER VIEW 会删除 Unity 目录注释,除非它们显式包含在 comment YAML 定义的字段中。 若要保留 Unity 目录中显示的注释,请参阅 选项 2

选项 2:保留 Unity 目录注释

注释

以下指南仅适用于在笔记本或 SQL 编辑器中使用 ALTER VIEW 命令时。 如果使用 YAML 编辑器 UI 将指标视图升级到版本 1.1,则 YAML 编辑器 UI 会自动保留 Unity 目录注释。

  1. 将所有 Unity 目录注释复制到 YAML 定义中的相应 comment 字段。 将 version 的值更改为 1.1
  2. 保存指标视图。
ALTER VIEW metric_view_name AS
$$
version: 1.1
source: samples.tpch.orders
comment: "Metric view of order (Updated comment)"

dimensions:
- name: order_date
  expr: o_orderdate
  comment: "Date of order - Copied from Unity Catalog"

measures:
- name: total_revenue
  expr: SUM(o_totalprice)
  comment: "Total revenue"
$$

有关每个功能的 YAML 规范版本历史记录和最低运行时要求,请参阅 指标视图功能可用性