基本的使用者运行数据分析

本主题演示了一个使用 API 的基本使用者运行分析用例。该用例显示了提供商如何以编程方式创建并共享一个包含数据的 Clean Room,以及使用者如何根据提供商的数据进行分析。提供商定义可以在其数据上运行的 SQL 查询。提供商可以定义仅查询提供商数据的查询、仅查询使用者数据的查询,或查询联接提供商和使用者数据的查询。

您可以下载 一个完整的代码示例,该示例演示如何创建、共享和运行提供商和使用者之间的基本 Clean Room。

提供商步骤

以下列表显示了如何创建、发布和与使用者共享 Clean Room 的主要步骤。每个步骤的详细信息将在列表之后提供。

  1. 设置环境以使用正确的角色和仓库。

  2. 创建一个新的 Clean Room。

  3. 将数据链接到 Clean Room 中。

  4. 设置联接策略,指定提供商数据中哪些列可以用于联接。

  5. 将模板导入 Clean Room。

  6. 设置列策略,指定提供商数据中的哪些列可以投影到哪些模板中。

  7. 添加可以在此 Clean Room 中作为使用者的账户。

  8. 设置默认版本,当使用者安装 Clean Room 时将加载该版本。

  9. 发布 Clean Room,发布后所有受邀使用者都可以安装并运行 Clean Room。

设置环境

To use the API, you must use a warehouse that SAMOOHA_APP_ROLE has privileges in. app_wh is one of a number of warehouses with access to the API. Choose the warehouse that is appropriate for your needs. (You can also use your own warehouse, if you choose.)

需要 samooha_app_role 角色才能访问 API。

USE WAREHOUSE app_wh;
USE ROLE samooha_app_role;
Copy

创建 Clean Room

下一步是创建一个新的 Clean Room。这可以通过一次 API 调用来完成,该调用需要指定 Clean Room 是供内部还是外部使用。内部 Clean Room 仅允许同一组织内的使用者访问;外部 Clean Room 可供组织外的使用者使用。对于这两种类型,使用者都必须被邀请才能访问 Clean Room。

当对外部 Clean Room 执行某些操作时,会触发额外的安全检查。发生这种情况时,您必须调用 provider.view_cleanroom_scan_status 查看安全扫描完成情况,然后才能继续进行下一步操作。

以下示例演示如何创建内部 Clean Room:

CALL samooha_by_snowflake_local_db.provider.cleanroom_init($cleanroom_name, 'INTERNAL');
Copy

设置联接策略

如果您向 Clean Room 添加允许使用者在数据上进行联接的模板,则应为数据设置 Clean Room 联接策略。Clean Room 联接策略指定在协作者运行的查询中哪些列 可以 用于联接。如果您未对数据设置任何联接策略,则默认所有列均可联接。受联接策略保护的列无法被投影。您自己的联接策略不会约束您自己的查询。

Clean Room 支持对已链接的数据设置 一些数据策略。这些策略类似于 Snowflake 的等效策略,但并不完全相同,并且仅应用于内部视图,不作用于源数据。在源数据上设置的任何 Snowflake 策略都会传播到您链接数据时创建的视图。Clean Room 策略仅设置在已链接的数据上,而不影响源数据。

重要

该模板负责 包含用于执行策略的 JinjaSQL 过滤器。如果模板不包含这些策略检查过滤器,则策略将不会被遵守。请务必在您编写的模板中添加策略检查,并检查您运行的任何模板,以确认它们遵守 Clean Room 策略。

您只能对自己链接的数据设置策略;不能对任何其他方的数据设置策略。

以下示例显示如何设置一个联接策略,使已链接表中的两列可用于联接:

CALL samooha_by_snowflake_local_db.provider.set_join_policy(
  $cleanroom_name,
  ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_EMAIL',
   'SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HASHED_PHONE']);
Copy

了解有关联接策略的更多信息。

向 Clean Room 添加模板

Clean Room 模板是一个有效的 JinjaSQL 模板,它几乎总是评估为 SQL 查询。模板(有时也称为 分析)可以由调用者传入实参,并且可以访问已链接到 Clean Room 的任何数据。提供商和使用者都可以向 Clean Room 添加模板并运行它们。

Snowflake 提供了一些标准模板,但其中大多数仅可在 UI 中使用。因此,您很可能需要为使用者(或您自己)编写自定义模板,以便通过 API 运行。

默认情况下,只有使用者才能运行模板。如果 提供商想要运行模板,则必须征得使用者的许可。同样,如果 使用者想要上传模板,也必须征得提供商的许可。

有关创建自定义模板的更多信息,请阅读 向 Clean Room 添加自定义模板自定义 Clean Room 模板参考

以下示例显示如何将 Snowflake 提供的模板添加到 Clean Room 中:

CALL samooha_by_snowflake_local_db.provider.add_templates(
  $cleanroom_name,
  ['prod_overlap_analysis']);
Copy

设置列策略

Clean room 列策略指定在协作者运行的查询中,您表中的哪些列可以被投影。列策略同时与列和模板相关联,因此可以针对不同模板定义不同列为可投影。模板必须存在于 Clean Room 中,然后才能为该模板设置列策略。

列策略和所有策略一样,是 覆盖型的;这意味着设置列策略会完全覆盖该账户之前设置的任何列策略。提供商和使用者都可以在自己的数据上设置列策略。如果您没有为自己的数据指定列策略,则所有列均可投影。了解有关列策略的更多信息。

以下示例显示如何允许从之前链接的 Clean Room 示例数据库中投影四列:

CALL samooha_by_snowflake_local_db.provider.set_column_policy($cleanroom_name, [
  'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS',
  'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND',
  'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE',
  'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:REGION_CODE']);
Copy

与使用者共享

提供商定义哪些使用者可访问 Clean Room。指定的使用者在 Clean Room 发布之前无法访问。只有由提供商添加的账户才能访问 Clean Room。使用者不能与其他使用者共享 Clean Room。

以下示例显示两名使用者如何共享一个 Clean Room。该过程使用两组并行的、以逗号分隔的列表,即使用者账户定位器和 使用者数据共享账户 IDs

CALL samooha_by_snowflake_local_db.provider.add_consumers(
  $cleanroom_name,
  'CONSUMER_LOCATOR1,CONSUMER_LOCATOR2',
  'CONSUMER_DATA_SHARING_ACCOUNT_ID1,CONSUMER_DATA_SHARING_ACCOUNT_ID2');
Copy

与其他云托管区域的使用者共享

如果使用者和提供商位于不同的云区域,则提供商和使用者必须启用 Cross-Cloud Auto-Fulfillment,然后才能将使用者添加到 Clean Room。您可以通过运行 SELECT CURRENT_REGION(); 来查看自己的云区域。您通常无法查看使用者所在的区域,但如果您尝试添加位于其他区域的使用者,则 provider.add_consumers 会失败,并显示一条相关问题的信息。发生此类故障时,您应该调用 provider.remove_consumers 移除不同区域的账户,然后启用 Cross-Cloud Auto-Fulfillment,再重新添加跨区域账户。

设置默认版本

Clean Room 是版本控制的原生应用程序。某些操作(如向 Clean Room 添加代码)会生成应用程序的新补丁版本。使用者必须在其账户中安装 Clean Room。他们安装的版本基于您指定的默认版本号。如果您稍后发布了 Clean Room 的新版本并增加默认版本号,则使用者安装的所有版本都将自动更新,新安装的版本将默认使用新版本。阅读有关 Clean Room 版本控制的更多信息。

以下示例显示如何将 Clean Room 的默认版本设置为 V1.0.0,这是 Clean Room 的初始版本(如果您尚未上传任何代码):

CALL samooha_by_snowflake_local_db.provider.set_default_release_directive(
  $cleanroom_name,
  'V1_0',          -- Version number: Never changes.
  '0'              -- Patch number: Can change.
  );
Copy

发布 Clean Room

按照以下示例发布或重新发布 Clean Room。首次调用此过程时,会使 Clean Room 对您已共享的所有使用者可见并可安装。每当您进行重大更改时,例如更新默认版本或对 Clean Room UI 进行特定更改时,都应调用此过程。

CALL samooha_By_snowflake_local_db.provider.create_or_update_cleanroom_listing(
  $cleanroom_name);
Copy

现在,使用者即可安装 Clean Room、链接数据、设置策略并运行模板,如下所述。

小技巧

当您不再需要某个用于测试的 Clean Room 时,应当在提供商和使用者的账户上删除该 Clean Room(provider.drop_cleanroomconsumer.uninstall_cleanroom)。每个账户的 Clean Room 数量和协作者数量都是有限制的。当您在账户中保留大量未使用的 Clean Room 时,可能会导致达到配额上限。

使用者步骤

提供商发布 Clean Room 后,所有被添加为协作者的使用者都可以使用 UI 或 API 来查看并安装 Clean Room。本节介绍使用者如何安装 Clean Room 并使用 API 进行分析。

以下是使用者需要执行的步骤简要概览:

  1. 设置环境。

  2. 安装 Clean Room。

  3. 设置联接和列策略。

  4. 运行分析。

设置环境

与提供商一样,使用者也必须使用 SAMOOHA_APP_ROLE 可以访问的 仓库。但是,与提供商不同的是,使用者可以直接使用 SAMOOHA_APP_ROLE 角色获得完整的 API 访问权限,或者该账户中的 Clean Room 管理员可以授予一个更有限的角色,使使用者仅能运行部分 API。这种受限角色有时被统称为“运行角色”,由具备完整 Clean Room 权限的用户授予。阅读如何授予受限 API 访问权限。

运行角色不允许安装 Clean Room,因此您必须使用 SAMOOHA_APP_ROLE,如以下示例所示:

USE WAREHOUSE app_wh;
USE ROLE samooha_app_role;
Copy

安装 Clean Room

以下代码片段显示了如何列出您已被邀请安装的所有 Clean Room:

-- See all clean rooms, installed and not.
CALL samooha_by_snowflake_local_db.consumer.view_cleanrooms();

-- See only clean rooms that aren't installed.
CALL samooha_by_snowflake_local_db.consumer.view_cleanrooms() ->>
  SELECT * FROM $1
    WHERE IS_ALREADY_INSTALLED = false;
Copy

安装提供商与您共享的 Clean Room,如以下示例所示。安装 Clean Room 时,必须指定提供商的账户定位器。

CALL samooha_by_snowflake_local_db.consumer.install_cleanroom(
  $cleanroom_name,
  '<PROVIDER_ACCOUNT_LOCATOR>');
Copy

小技巧

Clean Room 既有名称也有 ID。对于通过使用 API 创建的 Clean Room,在任何需要 Clean Room 名称 的 API 过程中,请使用 Clean Room 名称。对于通过 UI 创建的 Clean Room,在任何需要 Clean Room 名称的 API 过程中,请使用 Clean Room ID 而不是名称。

在 Clean Room UI 中,会将使用 API 创建的 Clean Room 标记为 Supported with Developer APIs

添加数据并设置策略

如果 Clean Room 模板允许使用者在查询中包含自己的数据,则使用者需要注册数据、链接数据并设置策略,方式与提供商类似。请务必使用 consumer 版本的这些过程,如以下示例所示:

-- You must use a role with MANAGE GRANTS privilege on an object to register it.
USE ROLE ACCOUNTADMIN;
CALL samooha_by_snowflake_local_db.consumer.register_db('MY_DATABASE');

-- Link some tables.
CALL samooha_by_snowflake_local_db.consumer.link_datasets(
$cleanroom_name,
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS', 'MY_DATABASE.PUBLIC.EXPOSURES']);
Copy

提供商的联接策略显示了哪些提供商列可以用于联接。此示例显示如何检查您可以联接的提供商列:

CALL samooha_by_snowflake_local_db.consumer.view_provider_join_policy($cleanroom_name);
Copy

备注

如果没有提供商的联接策略,则意味着提供商允许您对其数据的任意列进行联接,或者提供商不希望您对其数据进行联接。如果提供商未在其数据上实现联接策略,请与他们沟通以了解意图。

提供商需要得到使用者的批准才能在 Clean Room 中运行模板因此,大多数使用者不会费心为自己链接的表设置策略。

但是,我们仍建议您考虑添加策略,以防提供商日后需要请求才能运行模板,因为您可能会在那时忘记添加合适的策略。如果您未在自己的数据上设置联接或列属性,则所有列都是可联接和可投影的。

运行分析

在运行模板之前,您通常需要检查模板以查看其功能以及可接受的变量,然后检查 Clean Room 中有哪些提供商的表可用。

检查模板

您可以列出 Clean Room 中的模板,并查看每个模板的代码(除非提供商明确:ref:混淆了代码 <dcr_provider_add_custom_sql_template>)。这有助于您更好地理解查询。您也可以请求 Clean Room 解析模板,并显示在运行代码时可传入哪些变量。

您可以传入要在查询中使用的表列表,这取决于模板的设计。任何链接到 Clean Room 的表都可以传入模板。

许多模板还支持在运行时指定的变量;例如匹配特定值或指定要显示的列。理想情况下,提供商应向您提供一些有关模板的功能以及其接受实参的说明。但通常情况下,您也需要自己检查模板以查看代码。以下代码片段列出了任何协作者添加到 Clean Room 的模板,并获取某个特定模板所支持的实参:

-- View the templates available in this clean room.
-- Also shows the template code for each template.
CALL samooha_by_snowflake_local_db.consumer.view_added_templates($cleanroom_name);

-- Show which variables can be passed in when running the specified template.
CALL samooha_by_snowflake_local_db.consumer.get_arguments_from_template(
  $cleanroom_name,
  $template_name
);
Copy

小技巧

如果您看到模板中使用的 my_table 数组变量,则其中包含您在运行模板时传入的使用者表名称列表。如果您看到 source_table 数组变量,则其中包含您在运行模板时传入的提供商表名称列表。

查看可用数据

您可以列出您和提供商在 Clean Room 中已链接的数据集,如以下示例所示:

-- See which datasets you have linked into the clean room.
CALL samooha_by_snowflake_local_db.consumer.view_consumer_datasets($cleanroom_name);

-- See which datasets the provider has linked into the clean room.
CALL samooha_by_snowflake_local_db.consumer.view_provider_datasets($cleanroom_name);
Copy

传入表名时,使用这些过程结果中的表名,而不是 视图名称。

运行模板

在前两个步骤中,您已了解自己拥有哪些数据以及可以传入哪些变量。现在,您可以开始运行分析了。

根据查询和数据大小,您可能需要将仓库大小更改为 更合适的级别

以下示例显示一个用户如何调用一个模板,该模板同时包含使用者表和提供商表以及两个变量:dimensions,用作分组列;where_clause,在查询的 WHERE 子句中使用。

该模板针对单个提供商表运行查询,因此该请求将省略使用者表。

在以下示例中,请注意 dimensions 值是一个以 p 为前缀的列名。p 表示该列来自您传入的提供商表。列名通常需要加上 pc,分别表示列来源于提供商表或使用者表,以避免列名歧义。但是,此要求非常依赖于具体模板。您需要与模板提供商沟通,或检查模板代码,以了解何时需要这些前缀。

CALL samooha_by_snowflake_local_db.consumer.run_analysis(
$cleanroom_name,
$template_name,
[],                                              -- This template doesn't accept consumer tables.
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'],      -- Provider tables.
object_construct(                                -- Template-specific arguments.
  'dimensions', ['p.STATUS'],                    -- Template takes a variable named 'dimensions'.
  'where_clause', 'p.REGION_CODE=$$REGION_10$$'  -- Template allows you to pass in a WHERE clause.
                                                 -- $$ is used to wrap string literals
  )
);
Copy

示例代码

以下代码文件演示如何创建、共享和运行 Clean Room 分析。

请下载以下示例文件,然后将它们作为工作表文件上传至您的 Snowflake 账户中。您需要为提供商和使用者开设单独的账户,每个账户都要安装 Clean Room API。

语言: 中文