Compartir a través de

在指标视图中使用联接

指标视图中的联接支持从事实数据表到维度表(星型架构)的直接联接,以及从事实数据表遍历到维度表的联接,再到细分表,从而允许跨规范化维度表(雪花架构)进行多跃点联接。 本页介绍如何在指标视图的 YAML 定义中定义联接。

模型星型架构

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

使用 ON 子句或 USING 子句在指标视图中指定联接列。

  • ON 子句:使用布尔表达式定义联接条件。
  • USING 子句:列出父表和联接表中名称相同的列。 对于第一级联接,父级是指标视图的源。 对于雪花架构中的嵌套联接,父级是直接的上游联接。

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

注释

YAML 1.1 解析器(如 PyYAML)可能会错误地将某些未加引号的键(例如 onoffyesnoNO)解释为布尔值。 这可能会导致联接错误。若要避免此问题,请将这些密钥包装在引号中。 例如:'on': source.dim_fk = dim.pk

source: catalog.schema.fact_table

joins:

  # The on clause supports a boolean expression
  - name: dimension_table_1
    source: catalog.schema.dimension_table_1
    on: source.dimension_table_1_fk = dimension_table_1.pk

  # The using clause supports an array of columns
  # found in both of the tables being joined.
  - name: dimension_table_2
    source: catalog.schema.dimension_table_2
    using:
      - dimension_table_2_key_a
      - dimension_table_2_key_b

dimensions:

  # Dimension referencing a join column from dimension_table_1 using dot notation
  - name: Dimension table 1 key
    expr: dimension_table_1.pk

measures:

  # Measure referencing a join column from dimension_table_1
  - name: Count of dimension table 1 keys
    expr: COUNT(dimension_table_1.pk)

注释

命名空间 source 引用指标视图源中的列,而联接 name 引用联接表中的列。 例如,在联接条件 source.dimension_table_1_fk = dimension_table_1.pk中, source 引用指标视图的源表(fact_table),并 dimension_table_1 引用联接表。 如果在on 子句中没有提供前缀,则引用默认为联接表。

模型雪花架构

雪花架构通过标准化维度表并将其连接到子维度来扩展星型架构。 这会创建一个多级联接结构,该结构可以匹配数据模型的深度。

注释

Snowflake 联接需要 Databricks Runtime 计算引擎 17.1 及更高版本。

定义建模雪花架构的联接:

  1. 创建指标视图。

  2. 添加第一级(星型架构)联接。

  3. 与其他维度表联接。

  4. 通过在视图中添加维度来显现出嵌套维度。

以下示例使用 TPCH 数据集来说明如何建模雪花型模式。 可以在 Azure Databricks 工作区的目录中访问 samples TPCH 数据集。

source: samples.tpch.orders

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

dimensions:
- name: clerk
  expr: o_clerk
- name: customer
  expr: customer # returns the full customer row as a struct
- name: customer_name
  expr: customer.c_name
- name: nation
  expr: customer.nation
- name: nation_name
   expr: customer.nation.n_name