在本教程中,你将在 TPC-H 数据集上生成销售分析指标视图。 最后,你将获得一个指标视图,该视图包括:
- 使用雪花架构跨多个表联接订单和客户。
- 定义时间、地理和顺序属性的字段(也称为维度)。
- 计算简单和复杂的度量值,包括比率、筛选的聚合和窗口度量值。
- 使用可组合性从更简单的度量值生成复杂指标。
- 定义在查询时应用折扣率的参数。
- 包含供仪表板和 AI 工具使用的代理元数据。
如果你不熟悉指标视图,请从 “创建指标”视图 开始,了解基础知识。 本教程利用实际复杂性扩展了该基础。
Requirements
若要完成本教程,必须满足以下先决条件:
- 已启用 Unity Catalog 的工作区
- 运行 Databricks Runtime 17.3 或更高版本的 SQL 仓库或计算资源。
有关创建指标视图所需的权限的完整列表,请参阅 先决条件。
注释
Databricks Runtime 16.4 及更高版本支持创建指标视图。 本教程使用需要 Databricks Runtime 17.3 或更高版本的功能,并且某些步骤需要更高版本的运行时。 有关每个功能的最小运行时,请参阅 指标视图功能可用性。
数据模型
TPC-H 数据集为批发供应链建模。 本教程使用在雪花架构中联接的三个表:
-
orders联接到customerono_custkey = c_custkey -
customer联接到nationonc_nationkey = n_nationkey
| 表 | 角色 | 键列 |
|---|---|---|
orders |
事实数据表(订单事务) |
o_orderkey、o_custkey、o_totalprice、o_orderdate、o_orderstatus |
customer |
维度表(客户详细信息) |
c_custkey、c_name、c_mktsegment、c_nationkey |
nation |
维度表(国家或地区参考) |
n_nationkey、n_name、n_regionkey |
步骤 1:创建指标视图并打开编辑器
可以在目录资源管理器 UI 中生成此指标视图,使用 Genie Code 生成它,或直接编写完整的 YAML 定义。 这三种方法都解析为为指标视图建模的单个 YAML 定义。 在后续步骤中,选择 目录资源管理器 UI 或 YAML 编辑器 选项卡以遵循首选方法。 如果使用 YAML 编辑器,则每个步骤中的示例代码是与在此步骤中生成的内容相对应的 YAML 定义的部分。
注释
本教程中的 YAML 示例使用 fields 关键字。 在低代码编辑器中生成指标视图时,生成的 YAML 将改用等效 dimensions 关键字。 请参阅 字段。
如果不熟悉用于创建指标视图的 UI,请参阅 “创建指标”视图。
若要创建指标视图,请在目录资源管理器中:
- 搜索
samples.tpch.orders。 - 单击表名。
- 单击 创建>指标视图,并为该视图命名。
有关详细创建步骤,请参阅 “创建指标”视图。 当编辑器打开时,使用 UI 选项卡以交互方式生成,或单击 <> 该按钮直接编辑 YAML 定义。
步骤 2:设置指标视图
为指标视图设置版本和描述。
version 用于确定 YAML 规范版本,comment 用于说明指标视图的用途,该用途说明会显示在目录资源管理器中。 Azure Databricks为你管理版本。
目录浏览器 UI
该版本已为你定义好。 若要在保存指标视图后添加或编辑说明:
- 在目录资源管理器中,搜索指标视图并单击其名称。
- 单击 “说明”,然后输入指标视图的说明。 可以使用 YAML 编辑器 选项卡中显示的示例说明。
此文本对应于 comment YAML 定义中的字段。 有关编辑指标视图的更多方法,请参阅 “编辑指标”视图。
YAML 编辑器
version: 1.1
comment: |-
Sales analytics metric view for order performance analysis.
Joins orders with customers and geography.
Owner: Analytics Team
Last updated: 2025-01-15
步骤 3:定义源和联接
定义主源表并联接相关表:
-
source将事实数据表(orders)设置为粒度。 -
joins使用多对一关系引入客户数据。 - 嵌套的
nation连接演示了雪花型架构模式,通过customer连接到地理数据,其中 nation 是 customer 的子维度。
目录浏览器 UI
此示例添加了两个联接,这两个联接均为 多对一,以对雪花架构进行建模。
添加customer联接:
- 在编辑器中,单击右上角的 “联接 ”以打开 “添加联接 ”对话框。
- 搜索
samples.tpch.customer,单击表名,然后单击“ 添加”。 - 将联接条件设置为
o_custkey = c_custkey。 - 在“联接基数”下,选择“多对一”。 有关选择基数的指导,请参阅 联接基数。
然后添加嵌套 nation 联接。 重复执行 customer 联接中的步骤,将 samples.tpch.nation 联接到 c_nationkey = n_nationkey。 将联接嵌套在 customer 下,会将国家建模为客户的一个子维度。
有关完整联接对话框步骤,请参阅 步骤 2:添加联接。
YAML 编辑器
source: SELECT * FROM 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
步骤 4:定义筛选器
filter 会限制源数据,并且它适用于指标视图上的所有查询。 本教程将指标视图限制为最近数据。
目录浏览器 UI
定义筛选器:
- 在编辑器中,单击“
右上角的筛选器。
- 使用下拉菜单将列设置为
o_orderdate,将运算符设置为>=,并将值设置为1995-01-01。
有关筛选器的详细信息,请参阅 步骤 3:定义筛选器。
YAML 编辑器
filter: o_orderdate >= '1995-01-01'
步骤 5:定义字段
字段是用户用于分组和筛选的属性。 字段可以是分类列(例如区域或状态),也可以是用户在查询时聚合的未聚合数值列(例如年龄或数量)。
代理元数据
本教程中的每个字段和度量值都包含 代理元数据 属性,这些属性可改进指标视图使用仪表板和 AI 工具的方式:
-
display_name: 可视化效果中显示的可读标签,而不是技术列名称。 -
synonyms: 帮助 Ai 工具(如 Genie)通过自然语言查询发现字段和度量值的备用名称。 -
format: 值在下游图面(例如仪表板、笔记本和 SQL 查询结果)中的显示方式,例如货币、数字或百分比。
这些属性是可选的,但建议使用。 以下步骤中的字段和度量值定义会以内联方式直接给出。
字段定义
本教程添加:
-
时间字段:
order_date、order_month和order_year,提供多个粒度,以支持不同的分析需求。 -
转换后的字段:
order_status和order_priority,其使用CASE和SPLIT将源代码值转换为可读标签。 -
已联接字段:
customer_name、market_segment和customer_nation,它们使用联接名称引用已联接的表。 嵌套联接列使用链式点表示法(如customer.nation.n_name)来遍历雪花型架构。
目录浏览器 UI
编辑器会自动将所有源列添加到 “字段 ”选项卡。 通过编辑、重命名、删除和添加字段,使指标视图恰好定义以下内容。 对于每个字段,请单击其名称以编辑它或单击
以创建 它,然后在 生成器 或 自定义 模式下设置表达式。 设置每个字段的显示名称和同义词,如下所示。
order_date:在 Builder 模式下,选择
o_orderdate列。 将显示名称设置为Order Date.order_month:在 自定义 模式下,输入
DATE_TRUNC('MONTH', order_date)。 将显示名称设置为Order Month.order_year:在 自定义 模式下,输入
YEAR(order_date)。 将显示名称设置为Order Year.order_status:在 自定义 模式下,输入以下表达式。 将显示名称和
Order Status同义词设置为status,fulfillment status。CASE o_orderstatus WHEN 'O' THEN 'Open' WHEN 'P' THEN 'Processing' WHEN 'F' THEN 'Fulfilled' ENDorder_priority:在 自定义 模式下,输入
SPLIT(o_orderpriority, '-')[0]。 将显示名称设置为Priority.customer_name:在生成器模式下,从联接
c_name表中选择customer列。 将显示名称设置为Customer Name.market_segment:在生成器模式下,从联接
c_mktsegment表中选择customer列。 将显示名称和Market Segment同义词设置为segment,industry。customer_nation:在 自定义 模式下,输入
customer.nation.n_name以引用嵌套的nation联接。 将显示名称和Country同义词设置为nation,country。
有关完整字段步骤,请参阅 步骤 4:添加字段。
YAML 编辑器
fields:
- name: order_date
expr: o_orderdate
display_name: Order Date
- name: order_month
expr: "DATE_TRUNC('MONTH', order_date)"
display_name: Order Month
- name: order_year
expr: YEAR(order_date)
display_name: Order Year
- name: order_status
expr: |-
CASE o_orderstatus
WHEN 'O' THEN 'Open'
WHEN 'P' THEN 'Processing'
WHEN 'F' THEN 'Fulfilled'
END
display_name: Order Status
synonyms:
- status
- fulfillment status
- name: order_priority
expr: "SPLIT(o_orderpriority, '-')[0]"
display_name: Priority
- name: customer_name
expr: customer.c_name
display_name: Customer Name
- name: market_segment
expr: customer.c_mktsegment
display_name: Market Segment
synonyms:
- segment
- industry
- name: customer_nation
expr: customer.nation.n_name
display_name: Country
synonyms:
- nation
- country
步骤 6:定义参数
参数允许在查询值时将值传递到指标视图中,因此单个定义可以提供许多查询变体。 本教程中添加了一个 discount 参数,后续度量值会使用该参数来计算折后收入。 该参数的默认值为 0,因此未传入值的查询会返回未折扣收入。 有关参数的详细信息,请参阅 将参数与指标视图配合使用。
目录浏览器 UI
在编辑器标题中,单击“ 添加参数”。 输入 discount 为名称,然后输入默认值 0 并选择 double 数据类型。
YAML 编辑器
parameters:
- name: discount
data_type: double
default: 0
步骤 7:定义度量值
度量值是用户要分析的计算。 首先定义原子度量值,然后使用可组合性生成复杂指标,以使用函数引用早期定义的度量 MEASURE() 值。 按照display_name中所述,为每个度量设置format、synonyms和。 本教程添加:
-
原子度量:
order_count、total_revenue和unique_customers,这些构成基础组成部分的简单聚合方式。 -
组合度量值:
avg_order_value和revenue_per_customer,它引用早期定义的度量值MEASURE(),而不是复制聚合逻辑。 如果total_revenue更改,这些度量值会自动使用更新的定义。 请参阅 “可组合性”。 -
筛选度量:
open_order_revenue和fulfilled_order_revenue,它们使用FILTER (WHERE ...)来创建无需单独字段的条件度量。 -
参数化度量值:
discounted_revenue,它引用discount参数以应用折扣率。 请参阅 将参数与指标视图配合使用。 -
窗口度量:
t7d_customers用于计算过去 7 天内独立客户的滚动计数。 有关更多窗口测量模式,请参阅 窗口测量。
目录浏览器 UI
编辑器会自动添加示例 COUNT(*) 度量值。 编辑或删除它并添加度量值,以便指标视图定义以下内容。 对于每个度量值,请单击“
“添加”,然后在 Builder 或 Custom 模式下设置表达式。 按如下所示设置 显示名称、 格式和 同义词 。 对货币格式使用 2 个小数位数,对数字格式使用 0 个小数位数。
-
order_count:在构建器模式下,选择对执行
o_orderkey聚合。 将显示名称设置为Order Count,格式设置为 数字。 -
total_revenue:在构建器模式下,选择上的
o_totalprice聚合。 将显示名称设置为Total Revenue,格式设置为 Currency (USD),同义词设置为revenue,sales。 -
discounted_revenue:在 自定义 模式下,输入
SUM(o_totalprice * (1 - discount))。 将显示名称Discounted Revenue设置为 “货币”(USD)格式。 -
unique_customers:在生成器模式下,在上选择
o_custkey聚合。 将显示名称设置为Unique Customers,格式设置为 数字。 -
avg_order_value:在 自定义 模式下,输入
MEASURE(total_revenue) / MEASURE(order_count)。 将显示名称设置为Avg Order Value,格式设置为 Currency (USD),同义词设置为AOV。 -
revenue_per_customer:在 自定义 模式下,输入
MEASURE(total_revenue) / MEASURE(unique_customers)。 将显示名称Revenue per Customer设置为 “货币”(USD)格式。 -
open_order_revenue:在 自定义 模式下,输入
SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'O')。 将显示名称设置为Open Order Revenue,格式设置为 Currency (USD),同义词设置为backlog。 -
fulfilled_order_revenue:在自定义模式下,输入
SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'F')。 将显示名称Fulfilled Revenue设置为 “货币”(USD)格式。 -
t7d_customers:在 自定义 模式下,输入
COUNT(DISTINCT o_custkey)。 然后单击“+ 窗口”,并配置一个按order_date排序、范围为trailing 7 day且采用last半累加聚合的窗口。 将显示名称设置为7-Day Rolling Customers,格式设置为 数字。
有关完整度量步骤,请参阅 步骤 5:添加度量值。
YAML 编辑器
measures:
- name: order_count
expr: COUNT(DISTINCT o_orderkey)
display_name: Order Count
format:
type: number
decimal_places:
type: exact
places: 0
abbreviation: compact
- name: total_revenue
expr: SUM(o_totalprice)
display_name: Total Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- revenue
- sales
- name: discounted_revenue
expr: SUM(o_totalprice * (1 - discount))
display_name: Discounted Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: unique_customers
expr: COUNT(DISTINCT o_custkey)
display_name: Unique Customers
format:
type: number
decimal_places:
type: exact
places: 0
abbreviation: compact
- name: avg_order_value
expr: MEASURE(total_revenue) / MEASURE(order_count)
display_name: Avg Order Value
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- AOV
- name: revenue_per_customer
expr: MEASURE(total_revenue) / MEASURE(unique_customers)
display_name: Revenue per Customer
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: open_order_revenue
expr: SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'O')
display_name: Open Order Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- backlog
- name: fulfilled_order_revenue
expr: SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'F')
display_name: Fulfilled Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: t7d_customers
expr: COUNT(DISTINCT o_custkey)
window:
- order: order_date
semiadditive: last
range: trailing 7 day
display_name: 7-Day Rolling Customers
format:
type: number
decimal_places:
type: exact
places: 0
查看完整定义
完成上述步骤后,指标视图具有以下完整定义:
查看完整的 YAML 定义
version: 1.1
parameters:
- name: discount
data_type: double
default: 0
source: SELECT * FROM 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
filter: o_orderdate >= '1995-01-01'
comment: |-
Sales analytics metric view for order performance analysis.
Joins orders with customers and geography.
Owner: Analytics Team
Last updated: 2025-01-15
fields:
- name: order_date
expr: o_orderdate
display_name: Order Date
- name: order_month
expr: "DATE_TRUNC('MONTH', order_date)"
display_name: Order Month
- name: order_year
expr: YEAR(order_date)
display_name: Order Year
- name: order_status
expr: |-
CASE o_orderstatus
WHEN 'O' THEN 'Open'
WHEN 'P' THEN 'Processing'
WHEN 'F' THEN 'Fulfilled'
END
display_name: Order Status
synonyms:
- status
- fulfillment status
- name: order_priority
expr: "SPLIT(o_orderpriority, '-')[0]"
display_name: Priority
- name: customer_name
expr: customer.c_name
display_name: Customer Name
- name: market_segment
expr: customer.c_mktsegment
display_name: Market Segment
synonyms:
- segment
- industry
- name: customer_nation
expr: customer.nation.n_name
display_name: Country
synonyms:
- nation
- country
measures:
- name: order_count
expr: COUNT(DISTINCT o_orderkey)
display_name: Order Count
format:
type: number
decimal_places:
type: exact
places: 0
abbreviation: compact
- name: total_revenue
expr: SUM(o_totalprice)
display_name: Total Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- revenue
- sales
- name: discounted_revenue
expr: SUM(o_totalprice * (1 - discount))
display_name: Discounted Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: unique_customers
expr: COUNT(DISTINCT o_custkey)
display_name: Unique Customers
format:
type: number
decimal_places:
type: exact
places: 0
abbreviation: compact
- name: avg_order_value
expr: MEASURE(total_revenue) / MEASURE(order_count)
display_name: Avg Order Value
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- AOV
- name: revenue_per_customer
expr: MEASURE(total_revenue) / MEASURE(unique_customers)
display_name: Revenue per Customer
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: open_order_revenue
expr: SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'O')
display_name: Open Order Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- backlog
- name: fulfilled_order_revenue
expr: SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'F')
display_name: Fulfilled Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: t7d_customers
expr: COUNT(DISTINCT o_custkey)
window:
- order: order_date
semiadditive: last
range: trailing 7 day
display_name: 7-Day Rolling Customers
format:
type: number
decimal_places:
type: exact
places: 0
使用 SQL 创建指标视图
如果要在目录资源管理器外部生成此定义,请运行以下 SQL 来创建指标视图:
CREATE OR REPLACE VIEW catalog.schema.tpch_sales_analytics
WITH METRICS
LANGUAGE YAML
AS $$
version: 1.1
parameters:
- name: discount
data_type: double
default: 0
source: SELECT * FROM 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
filter: o_orderdate >= '1995-01-01'
comment: |-
Sales analytics metric view for order performance analysis.
Joins orders with customers and geography.
Owner: Analytics Team
Last updated: 2025-01-15
fields:
- name: order_date
expr: o_orderdate
display_name: Order Date
- name: order_month
expr: "DATE_TRUNC('MONTH', order_date)"
display_name: Order Month
- name: order_year
expr: YEAR(order_date)
display_name: Order Year
- name: order_status
expr: |-
CASE o_orderstatus
WHEN 'O' THEN 'Open'
WHEN 'P' THEN 'Processing'
WHEN 'F' THEN 'Fulfilled'
END
display_name: Order Status
synonyms:
- status
- fulfillment status
- name: order_priority
expr: "SPLIT(o_orderpriority, '-')[0]"
display_name: Priority
- name: customer_name
expr: customer.c_name
display_name: Customer Name
- name: market_segment
expr: customer.c_mktsegment
display_name: Market Segment
synonyms:
- segment
- industry
- name: customer_nation
expr: customer.nation.n_name
display_name: Country
synonyms:
- nation
- country
measures:
- name: order_count
expr: COUNT(DISTINCT o_orderkey)
display_name: Order Count
format:
type: number
decimal_places:
type: exact
places: 0
abbreviation: compact
- name: total_revenue
expr: SUM(o_totalprice)
display_name: Total Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- revenue
- sales
- name: discounted_revenue
expr: SUM(o_totalprice * (1 - discount))
display_name: Discounted Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: unique_customers
expr: COUNT(DISTINCT o_custkey)
display_name: Unique Customers
format:
type: number
decimal_places:
type: exact
places: 0
abbreviation: compact
- name: avg_order_value
expr: MEASURE(total_revenue) / MEASURE(order_count)
display_name: Avg Order Value
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- AOV
- name: revenue_per_customer
expr: MEASURE(total_revenue) / MEASURE(unique_customers)
display_name: Revenue per Customer
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: open_order_revenue
expr: SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'O')
display_name: Open Order Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
synonyms:
- backlog
- name: fulfilled_order_revenue
expr: SUM(o_totalprice) FILTER (WHERE o_orderstatus = 'F')
display_name: Fulfilled Revenue
format:
type: currency
currency_code: USD
decimal_places:
type: exact
places: 2
abbreviation: compact
- name: t7d_customers
expr: COUNT(DISTINCT o_custkey)
window:
- order: order_date
semiadditive: last
range: trailing 7 day
display_name: 7-Day Rolling Customers
format:
type: number
decimal_places:
type: exact
places: 0
$$;
有关创建指标视图的其他方法,请参阅 “创建指标”视图。
步骤 8:查询指标视图
使用业务友好语法查询指标视图。 该 MEASURE() 函数在所选字段的粒度处聚合度量值。
按维度聚合指标
此示例跨多个字段聚合度量值。 它按客户所在国家和市场细分返回总收入、订单数量和平均订单金额,并按收入从高到低排序:
SELECT
customer_nation,
market_segment,
MEASURE(total_revenue) AS total_revenue,
MEASURE(order_count) AS order_count,
MEASURE(avg_order_value) AS avg_order_value
FROM catalog.schema.tpch_sales_analytics
GROUP BY customer_nation, market_segment
ORDER BY total_revenue DESC;
分析每月趋势
此示例将时间字段与度量值组合在一起,以跟踪趋势。 按月份和订单状态返回总收入和未结订单收入(积压订单):
SELECT
order_month,
order_status,
MEASURE(total_revenue) AS total_revenue,
MEASURE(open_order_revenue) AS open_order_revenue
FROM catalog.schema.tpch_sales_analytics
GROUP BY order_month, order_status
ORDER BY order_month;
传递参数值
由于指标视图定义了参数,因此你可以将其调用为表值函数,并在查询时传递值。 以下查询使用 10% 折扣。 由于 discount 存在默认值 0,因此省略参数的查询将返回未分配的收入:
SELECT
customer_nation,
MEASURE(total_revenue) AS total_revenue,
MEASURE(discounted_revenue) AS discounted_revenue
FROM catalog.schema.tpch_sales_analytics(discount => 0.1)
GROUP BY customer_nation
ORDER BY discounted_revenue DESC;
你学到的内容
你生成了一个指标视图,该视图演示了:
| Feature | 示例 |
|---|---|
| Snowflake 架构联接 | 客户到国家/国的订单(嵌套多对一联接) |
| 时间字段 | 日期、月份、年份精度 |
| 转换后的字段 |
CASE 语句, SPLIT 函数 |
| 简单度量值 |
COUNT、SUM |
| 可组合性 |
avg_order_value 和 revenue_per_customer 使用 MEASURE() 引用早期定义的度量标准 |
| 筛选度量值 |
FILTER (WHERE ...) 用于条件聚合 |
| 窗口度量值 | 使用滚动 7 天客户计数 trailing 7 day |
| 参数 | 应用于 discount 度量值中的 discounted_revenue 参数 |
| 代理元数据 |
display_name、format、synonyms上的字段和度量值 |