自由格式 SQL 查询

数据提供商可以允许通过模板或自由格式查询向分析运行者公开其数据。当数据提供商在数据集上启用自由格式查询时,任何有权访问该数据产品的分析运行者都可以在其环境中针对该数据集运行 SQL 查询。

分析运行者和数据提供商必须都已加入 Collaboration,数据才能变为可用状态。

概述

以下是在 Clean Room 中针对数据运行自由格式查询的步骤:

数据提供商

  1. 注册包含一个或多个指定了 allowed_analyses: template_and_freeform_sql 的数据集的数据产品。

    如果数据提供商想要将 Snowflake 策略应用于数据集中的列,则必须在注册数据之前创建这些策略,并将策略与数据产品规范中的列相关联。

  2. 以标准方式将数据产品链接到 Collaboration 中。

分析运行者

在 Collaboration 安装到其账户后,分析运行者将调用 VIEW_DATA_OFFERINGS。如果 freeform_sql_view_name 列中有值,则可以直接针对该列中命名的视图查询数据集。

freeform_sql_column_policies 中列出的任何策略都由 Collaboration 应用于数据。数据提供商直接应用于源数据的任何策略都会被强制执行,但不会显示在该列中。

以下章节提供了有关数据提供商和分析步骤的详细信息。

注册自由格式查询数据集(数据提供商)

以下步骤显示了如何在数据产品注册期间启用自由格式查询:

  1. 在 Collaboration 规范中指定 allowed_analyses: template_and_freeform_sql。这将启用使用模板或自由格式查询来查询数据集。

    ...
    datasets:
    - alias: customers_view
      data_object_fqn: PROVIDER_DB.DATA_SCH.CUSTOMERS
      object_class: custom
      allowed_analyses: template_and_freeform_sql
      schema_and_template_policies:
        HASHED_EMAIL:
          category: join_standard
          column_type: hashed_email_b64_encoded
    ...
    

    只有 schema_and_template_policies 下列出的列可用于通过模板或自由格式查询进行查询。

  2. 如果您想在自由格式查询中应用 Snowflake 策略而不将其应用于源数据,请执行以下步骤:

    1. 以标准方式创建 Snowflake 策略。不要将它们应用于您的表。

      CREATE OR REPLACE AGGREGATION POLICY PROVIDER_DB.DATA_SCH.MIN_GROUP_SIZE_POLICY
        AS () RETURNS AGGREGATION_CONSTRAINT ->
          AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
      

      创建 Collaboration 的角色必须对数据库、架构和策略对象具有 USAGE 权限。

      这些策略是动态链接的;您对这些策略所做的任何更改都会立即影响使用这些策略的任何数据集,即使该数据产品已经注册并链接。

    2. freeform_sql_policies 字段下的数据产品规范中分配您的策略。重要提示:如果列已被重命名,则 freeform_sql_policies 下使用的所有列名称必须使用 自动生成的列名称。重命名仅影响 join-standard 类别列。

      这些策略不会直接应用于源表,仅应用于由 Collaboration 注册的视图。

      schema_and_template_policies:
        HASHED_EMAIL:                                  # Source column name.
          category: join_standard
          column_type: hashed_email_b64_encoded        # Column is renamed to the column_type value.
        STATUS:
          category: passthrough
        AGE_BAND:
          category: passthrough
        DAYS_ACTIVE:
          category: passthrough
        INCOME_BRACKET:
          category: passthrough
      freeform_sql_policies:          # Apply agg, join, and masking policies created by the data owner to these columns.
        aggregation_policy:
          name: PROVIDER_DB.DATA_SCH.MIN_GROUP_SIZE_POLICY
          entity_keys:
            - HASHED_EMAIL_B64_ENCODED
        join_policy:
          name: PROVIDER_DB.DATA_SCH.EMAIL_JOIN_POLICY
          columns:
            - HASHED_EMAIL_B64_ENCODED    # This is the renamed column.
        masking_policies:
          - name: PROVIDER_DB.DATA_SCH.MASK_INCOME_POLICY
            columns:
              - INCOME_BRACKET
      
  3. 通过调用 REGISTER_DATA_OFFERING 以标准方式注册数据产品。

运行自由格式查询(分析运行者)

当分析运行者调用 VIEW_DATA_OFFERINGS 时,如果 freeform_sql_view_name 列中出现值,则可以直接查询自由格式 SQL 视图,而无需使用模板。所有应用于源表或在 :ref:` 数据产品的 <label-dcr_collaboration_data_yaml>` freeform_sql_policies 部分中定义的 Snowflake 策略都会在查询中强制执行。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_DATA_OFFERINGS($collaboration_name);

TEMPLATE_VIEW_NAME

data_provider.provider_customers_V1.customers

TEMPLATE_JOIN_COLUMNS

hashed_email_b64_encoded

ANALYSIS_ALLOWED_COLUMNS

STATUS, AGE_BAND, DAYS_ACTIVE, INCOME_BRACKET

ACTIVATION_ALLOWED_COLUMNS

FREEFORM_SQL_VIEW_NAME

SFDCR_FREEFORM_SQL_DEMO.FREEFORM_SQL.DATA_PROVIDER_PROVIDER_CUSTOMERS_V1_CUSTOMERS

FREEFORM_SQL_COLUMN_POLICIES

{
  "aggregation_policy": {"entity_keys": ["HASHED_EMAIL_B64_ENCODED"]},
  "masking_policy": {"columns": ["INCOME_BRACKET"]},
  "join_policy": {"columns": ["HASHED_EMAIL_B64_ENCODED"]},
  "no_policy": {"columns": ["DAYS_ACTIVE", "AGE_BAND", "STATUS"]}
}

SHARED_BY

data_provider

SHARED_WITH

["data_consumer"]

DATA_OFFERING_ID

provider_customers_V1

您必须使用来自 freeform_sql_view_name 的值,而不是 来自 template_view_name 的值。

SELECT status, COUNT(*) AS customer_count
  FROM SFDCR_FREEFORM_SQL_DEMO.FREEFORM_SQL.DATA_PROVIDER_PROVIDER_CUSTOMERS_V1_CUSTOMERS AS t
  GROUP BY status
  ORDER BY customer_count DESC;

示例:双方协作

以下示例演示了一个双方 Collaboration,其中一方(“提供商”)是 Collaboration 所有者和使用者的数据提供商。另一方(“使用者”)是分析运行者,可以运行模板并使用提供商提供的数据,还可以根据数据提供商规范中定义的策略对数据运行自由格式 SQL 查询。

要运行此示例,您必须拥有两个已安装 Snowflake Data Clean Rooms 的不同账户。

您可以下载文件并将其上传到您的 Snowflake 账户,也可以使用 Snowsight 将示例代码复制并粘贴到两个单独账户的工作表中。

下载源 SQL 文件,然后将它们上传到两个已安装 Snowflake Data Clean Rooms 的独立账户: