数据产品

数据产品 是协作中与特定分析运行者共享的一个或多个视图(称为 数据集)。您可以与在 协作规范 中被您定义为数据提供方的分析运行者共享数据。

数据产品是源数据的实时视图,而不是注册数据产品时的数据快照。应用于源数据的任何 Snowflake 策略在数据产品中都处于活动状态。

注册数据产品时,Snowflake 会为 数据产品规范 中列出的每个数据源创建视图。该视图 仅 包括数据产品规范中列出的列。根据列所属的类别,某些列在此阶段会 被重命名。

此外,当您将数据产品关联到协作中时,Snowflake 会创建所注册视图的一个副本,并根据 协作规范 将对该视图的访问权限仅限于指定的分析运行者。

重要

如果您移动、重命名或更改基础表的访问权限,则数据产品将无法通过任何以前注册的链接使用。

如果您使用的是 Snowflake Standard Edition,则无法通过具有策略强制执行机制的 Data Clean Room 来共享数据。因此,您无法与其他方共享数据,即使对于您自己账户中的用户,也无法利用数据产品中指定的 Data Clean Room 策略。不过,您可以访问其他协作者的数据产品,或者 :ref:`将您自己的数据用作本地数据产品 <label-dcr_using_local_data>`(不含策略)。

数据产品要求:

  • 对于您要共享的任何数据,您必须拥有其 GRANT OPTION 对象上的 REFERENCE_USAGE 权限。如果不具备该权限,当您尝试注册、加入协作或关联数据时,将会收到 “issing reference usage grant” 的错误提示。

    GRANT REFERENCE_USAGE ON DATABASE my_database TO ROLE my_role WITH GRANT OPTION;
    
  • 您必须在协作中拥有 数据提供商协作角色。

  • 目前,只有创建或加入协作的账户角色才能将数据关联到协作中或从协作中解除关联。

继续阅读,了解如何注册数据产品并将其关联到协作中:

注册数据产品

  1. 为您的数据创建 数据产品规范。指定有关数据产品的以下详细信息:

    • 数据产品中每个数据集的源对象。

    • 每个数据集中包含哪些列。

    • 每列的类型(联接或其他方式),用于填充 Clean Room 策略。在某些情况下,您还将指定各个列的格式。

    • 要应用到数据产品中各列上的任何 Snowflake 数据保护策略。

    • 用户访问数据的方式:仅能通过模板访问,还是也可以通过 自由格式的 SQL 查询 访问。

  2. 通过调用 REGISTER_DATA_OFFERING 注册数据产品,这会返回数据产品 ID。

    此步骤使数据产品变为 可用 状态,供您账户中任何对该注册表具有读取权限的角色关联到任意协作中。您可以使用同一个数据产品 ID,将数据产品分享到多个协作中。

源列重命名

在将数据产品中的列名称公开给分析运行者之前,可以对其进行重命名。重命名取决于 数据产品规范 中定义列的 category 和 column_type 值,如下表所述:

列 category

新列名称

join_standard

column_type 值

timestamp

timestamp

join_custom、passthrough 或 event_type

使用原始列名称。

例如,如果源表中的列名为 user_email_address,那么该列对分析运行者的暴露方式将取决于其在数据产品规范中的定义:

数据产品规范

列的引用方式

...
schema_and_template_policies:
  user_email_address:
    category: join_standard
    column_type: hashed_email_sha256

column_type 用于 join_standard 列:

SELECT HASHED_EMAIL_SHA256
FROM source_table[0];

将数据保护策略应用于数据产品

在 Clean Room 中共享的数据通过多种方式受到保护:

  • 在 Clean Room 环境中注册的数据会被创建为安全视图,该视图会省略数据产品规范中未列出的任何列。

  • 安全视图仅与协作规范指定的特定用户和模板共享。

  • 您可以将 Snowflake 策略添加到数据中,以进一步管理数据的使用方式。

  • 同时,还会根据数据产品列的分类应用 Data Clean Room 模板策略。

有两种方式可以对您共享的数据应用 Snowflake 数据保护策略(例如 联接 策略或 聚合 策略):

将 Snowflake 策略应用于源数据

应用于源数据的任何 Snowflake 策略也适用于协作中的数据产品视图。

如果您对源数据应用了 Snowflake 策略,请告知您的协作者,以免他们在不知情的情况下运行了基于不可联接列进行联接或不符合聚合要求的查询。在数据产品的 description 字段中提及任何 Snowflake 策略。

重要

在注册带有 Snowflake 数据策略的数据产品时,您应使用不受这些策略约束的角色,或暂时挂起该策略,直到数据注册完成后再恢复。

这是因为作为注册过程的一部分,Snowflake Data Clean Rooms 会对源表运行验证查询。如果测试查询无法返回有意义的结果,则注册失败。某些 Snowflake 数据策略可能会导致测试失败。例如,某个表可能带有聚合策略,而验证查询返回的行数不足以满足该聚合策略的最小分组规模要求。

将 Snowflake 策略应用到数据产品(仅限自由格式查询使用)

您可以在共享数据通过 自由格式查询 被访问时,对其应用 Snowflake 策略,而无需将这些策略应用到源数据上。除了直接应用于源表的任何 Snowflake 策略之外,还会应用这些策略。

要为数据添加自由格式的 SQL 策略,请执行以下步骤:

  1. 创建 Collaboration Data Clean Room 支持的策略类型。

  2. 将以下信息添加到数据产品规范中:

    • 设置 allowed_analyses: template_and_freeform_sql。

    • 将 freeform_sql_policies 部分添加到数据集条目。

    • 在 freeform_sql_policies 下面添加适当的策略类型部分,列出您创建的 Snowflake 策略,以及要为这些策略应用的协作列。支持的策略类型包括:

      • aggregation_policy:选择使用 时默认使用的角色和仓库。具有可选实体键的单个聚合策略。

      • projection_policies:选择使用 时默认使用的角色和仓库。投影策略数组,每个策略都具有列绑定。

      • join_policy:选择使用 时默认使用的角色和仓库。具有可选列绑定的单个联接策略。

      • masking_policies:选择使用 时默认使用的角色和仓库。掩码策略数组,每个掩码策略都具有列绑定。

      • row_access_policy:选择使用 时默认使用的角色和仓库。具有可选列绑定的单行访问策略。

    注册数据产品的角色必须对这些策略拥有 USAGE 权限。

协作者在调用 COLLABORATION.VIEW_DATA_OFFERINGS 时会看到应用于数据的策略类型。

您可以对多个表的多个列重复使用同一个策略。

示例:

CREATE OR REPLACE AGGREGATION POLICY my_db.public.my_agg_policy AS ()
  RETURNS AGGREGATION_CONSTRAINT ->
    AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);

Snowflake Data Clean Room 模板策略

Snowflake Data Clean Room 在 Snowflake 策略系统之上,还支持自身的策略系统。协作中的每个数据提供商都可以为其数据产品设置以下策略:

  • 联接策略,指定 可以 联接哪些列。

  • 列策略,指定 可以 投影哪些列。

  • 激活策略,指定 可以 激活哪些列。

数据提供商可以在其数据产品规范中设置这些策略:

  • 如果列的 category 是 join_standard 或 join_custom,该列将添加到 Clean Room 的联接策略中。

  • 如果列的 category 设置为任何其他值时,该列将添加到 Clean Room 的列策略中。

  • 如果列的 activation_allowed 值设置为 TRUE,它也会添加到 Clean Room 的激活策略中。

当模板具备相应的 策略检查过滤器 时,这些策略即会被强制执行。这些筛选器是:join_policy、column_policy、activation_policy、join_and_column_policy。在模板执行时,这些过滤器会验证所引用的列是否被数据产品规范中相应的策略集所允许。如果将筛选器应用于不属于指定策略的列,则模板将失败。

例如,col1 和 col2 都必须属于数据提供方的联接策略(category: join_standard 或 category: join_custom),否则以下模板片段将抛出错误:

SELECT *
FROM T1
JOIN T2
ON {{ t1_col | sqlsafe | join_policy }} = {{ t2_col | sqlsafe | join_policy }}

使用命名路径来组织数据产品

您可以使用命名路径从概念上对数据产品进行分组。这特别有效,因为每个数据产品都代表一个或多个表或视图。使用语法 collaborator alias.data offering ID.dataset alias 访问单个表,其中数据产品 ID 是用户提供的名称和版本值的组合,别名是产品中的单个表。

在注册数据产品时,可将名称、版本和别名视为一种作用域体系,从而按产品和别名对数据进行组织。例如,您可以注册以下销售数据的数据产品,其中每个表对应一个 US 州:

api_version: 2.0.0
spec_type: data_offering
version: v0
name: examplecorp_sales_by_state
datasets:
 - alias: AL
   data_object_fqn: mydb.mysch.al_data
 - alias: NY
   data_object_fqn: mydb.mysch.ny_data
 - alias: CA
   data_object_fqn: mydb.mysch.ca_data

分析运行者将这些表引用为 user_alias.offering_id.AL、user_alias.offering_id.NY 和 user_alias.offering_id.CA。