Snowflake Data Clean Room:创建带用户界面的自定义分析模板

本主题介绍提供商如何以编程方式创建 Clean Room 并与使用者共享,同时提供一个用户界面,让使用者可使用该界面在 Web 应用程序 中执行分析。它类似于机器学习流程,但演示了如何为使用者提供一个用户界面,实现原本更加复杂的机器学习工作流程。

此示例生成了一个带有 相似建模 模板的 Clean Room。相似建模是一种分析方法,其中使用者试图通过对提供商的“高价值”客户进行统计模型训练,从供应商的数据中找到高价值客户。该模型使用使用者指定的标志来表示使用者数据集中的高价值用户,如支出超过某一阈值的用户。然后,利用训练好的模型来推断提供商数据中的哪些客户可能对使用者具有“高价值”。

您可以将多个自定义模板应用于 Clean Room,每个模板都将显示在使用者的 Web 应用程序中。

这是创建并与 UI 共享 Clean Room 的一般流程:

  • 提供商:

    1. 设置编码环境,包括指定要使用的适当角色和仓库。

    2. 创建 Clean Room 并启用 Clean Room 所需的任何跨区域共享。

    3. 将数据添加到 Clean Room,并设置表的联接策略。

    4. 添加需要的任何自定义脚本。

    5. 设置模板的列策略。

    6. 创建模板 UI 并应用于 Web 应用程序。

    7. 与使用者共享 Clean Room。

  • 使用者:

    1. 使用 Web 应用程序安装 Clean Room 并对其运行分析。

先决条件

您需要两个独立的 Snowflake 账户才能完成此流程。使用第一个账户执行提供商的命令,然后切换到第二个账户执行使用者的命令。

提供商

使用提供商账户中的 Snowflake 工作表执行本节中的命令。

设置环境

在使用 Developer APIs 之前,您需要承担 SAMOOHA_APP_ROLE 角色,并指定用来执行 APIs 的仓库。如果您没有 SAMOOHA_APP_ROLE 角色,请联系账户管理员。

执行以下命令以设置您的环境:

USE ROLE samooha_app_role;
USE WAREHOUSE app_wh;
Copy

创建 Clean Room

在创建 Clean Room 之前,您需要为 Clean Room 指定一个 字母数字 名称。名称中不能包含除空格和下划线以外的特殊字符。确保 Clean Room 的名称不会与现有 Clean Room 重复。

要指定 Clean Room 名称,请执行以下命令:

SET cleanroom_name = 'UI Registration ML Clean room';
Copy

现在,您可以执行 provider.cleanroom_init 命令来创建 Clean Room。第二个实参定义了 Clean Room 的分发。在本例中,您可以将其设置为 INTERNAL,从而绕过向协作者发布 Clean Room 之前进行的自动安全扫描。要使用 INTERNAL 分发方法,提供商和使用者账户必须在同一个组织内。对于分发到不同组织的账户的 Clean Room,则必须使用 EXTERNAL 分发。

要创建 Clean Room,请执行以下命令:

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

创建 Clean Room 之后,必须先设置其发布指令,然后才能与协作者共享。

备注

如果 Clean Room 分发设置为 EXTERNAL,则必须等待安全扫描完成,然后再设置发布指令。您可以通过执行以下步骤来查看安全扫描的状态:

CALL samooha_by_snowflake_local_db.provider.view_cleanroom_scan_status($cleanroom_name);
Copy

只要在尝试执行 provider.create_or_update_cleanroom_listing 命令前设置好发布指令,就可以在安全扫描期间继续执行命令。

要设置 Clean Room 发布指令,请执行以下命令:

CALL samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', '0');
Copy

跨区域共享

如果 Snowflake 客户的账户与您的账户位于不同区域,则必须启用 Cross-Cloud Auto-Fulfillment 才能与该客户共享 Clean Room。有关与其他区域的使用者协作的额外成本的信息,请参阅 Cross-Cloud Auto-Fulfillment 成本

使用开发者 APIs 时,启用跨区域共享分为两步:

  1. 具有 ACCOUNTADMIN 角色的 Snowflake 管理员为 Snowflake 账户启用 Cross-Cloud Auto-Fulfillment。有关说明,请参阅 与不同区域的账户协作

  2. 您执行 provider.enable_laf_for_cleanroom 命令,为 Clean Room 启用 Cross-Cloud Auto-Fulfillment。例如:

    CALL samooha_by_snowflake_local_db.provider.enable_laf_for_cleanroom($cleanroom_name);
    
    Copy

在为 Clean Room 启用 Cross-Cloud Auto-Fulfillment 后,您可以使用 provider.create_or_update_cleanroom_listing 命令照常将使用者添加到列表中。列表会根据需要自动复制到远程云和区域。

添加数据并设置联接策略

将 Snowflake 表链接到 Clean Room,请浏览 Snowflake 账户中的表列表,并以数组形式输入完全限定的表名称 (Database.Schema.Table)。该过程在 Clean Room 内创建表的安全视图,自动使 Clean Room 可以访问表,从而无需制作表副本。

CALL samooha_by_snowflake_local_db.provider.link_datasets($cleanroom_name, ['samooha_provider_sample_database.lookalike_modeling.customers']);
Copy

备注

如果即使表存在,此步骤也不起作用,则很可能 SAMOOHA_APP_ROLE 角色还没有被授予访问该表的权限。如果是,请切换到 ACCOUNTADMIN 角色,对数据库调用以下过程,然后切换回来执行流程的剩余部分:

USE ROLE accountadmin;
CALL samooha_by_snowflake_local_db.provider.register_db('<DATABASE_NAME>');
USE ROLE samooha_app_role;
Copy

您可以通过调用以下过程来查看与 Clean Room 链接的数据集名称。

CALL samooha_by_snowflake_local_db.provider.view_provider_datasets($cleanroom_name);
Copy

您可以使用以下查询查看关联到 Clean Room 的数据集:

SELECT * FROM <PROVIDER_TABLE> LIMIT 10;
Copy

指定使用者在 Clean Room 内运行模板时可以联接哪些列。应对身份列(如电子邮件)调用此过程。联接策略是“仅替换”,因此如果再次调用函数,新的联接策略会完全替换之前设置的联接策略。

CALL samooha_by_snowflake_local_db.provider.set_join_policy($cleanroom_name, ['samooha_provider_sample_database.lookalike_modeling.customers:hashed_email']);
Copy

如果要查看所有列以决定联接策略列,请调用以下过程。

CALL samooha_by_snowflake_local_db.provider.view_join_policy($cleanroom_name);
Copy

添加自定义代码

为 Clean Room 添加机密的机器学习 Python 代码

在 Clean Room 中加载一些 Python 函数,以便相似 ML 正常运行。Clean Room 中安装的所有 Python 函数都是完全机密的。使用者无法看到。

以下 API 允许您将 Python 函数直接定义为 Clean Room 中的内联函数。或者,您可以从已上传到 Clean Room 暂存区的暂存文件中加载 Python。请参阅 API 参考指南 中的示例。

备注

需要注意的是,这种实施方式受总 Snowflake 大小对于 ARRAY_AGG 可汇总的数据量(即 16MB)约束的限制。利用批处理和流模型的实施方案可通过批处理扩展到任意大小的数据集,这种实施方案 可应要求提供

CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
    $cleanroom_name,
    'lookalike_train',
    ['input_data variant', 'labels variant'],
    ['pandas', 'numpy', 'xgboost'],
    'variant',
    'train',
$$
import numpy as np
import pandas as pd
import xgboost
from sklearn import preprocessing
import sys
import os
import pickle
import codecs
import threading


class TrainXGBoostClassifier(object):
    def __init__(self):
        self.model = None
        self._params = {
            "objective": "binary:logistic",
            "max_depth": 3,
            "nthread": 1,
            "eval_metric": "auc",
        }
        self.num_boosting_rounds = 10

    def get_params(self):
        if self.model is not None and "updater" not in self._params:
            self._params.update(
                {"process_type": "update", "updater": "refresh", "refresh_leaf": True}
            )
        return self._params

    def train(self, X, y):
        # Train the model in a threadsafe way

        # pick only the categorical attributes
        categorical = X.select_dtypes(include=[object])

        # fit a one-hot-encoder to convert categorical features to binary features (required by XGBoost)
        ohe = preprocessing.OneHotEncoder()
        categorical_ohe = ohe.fit_transform(categorical)
        self.ohe = ohe

        # get the rest of the features and add them to the binary features
        non_categorical = X.select_dtypes(exclude=[object])
        train_x = np.concatenate((categorical_ohe.toarray(), non_categorical.to_numpy()), axis=1)

        xg_train = xgboost.DMatrix(train_x, label=y)

        params = self.get_params()
        params["eval_metric"] = "auc"
        evallist = [(xg_train, "train")]
        evals_result = {}

        self.model = xgboost.train(
            params, xg_train, self.num_boosting_rounds, evallist, evals_result=evals_result
        )

        self.evals_result = evals_result

    def __dump_model(self, model):
        # Save down the model as a json string to load up for scoring/inference

        pickle_jar = codecs.encode(pickle.dumps([model, self.ohe]), "base64").decode()
        return pickle_jar

    def dump_model(self):
        # Save down the model as a json string to load up for scoring/inference
        if self.model is not None:
            return self.__dump_model(self.model)
        else:
            raise ValueError("Model needs to be trained first")


def train(d1, l1):
    # get take training features and put them in a pandas dataframe
    X = pd.DataFrame(d1)

    # get the labels into a Numpy array
    y = np.array(l1)

    trainer = TrainXGBoostClassifier()
    trainer.train(X, y)

    # return training stats, accuracy, and the pickled model and pickled one-hot-encoder
    return {
        "total_rows": len(d1),
        "total_bytes_in": sys.getsizeof(d1),
        "model": trainer.dump_model(),
        "iteration": trainer.num_boosting_rounds,
        "auc": np.max(trainer.evals_result["train"]["auc"]),
        "error": 1 - np.max(trainer.evals_result["train"]["auc"])
    }   
$$);
Copy

现在,在 Clean Room 中安装评分函数:

CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
    $cleanroom_name,
    'lookalike_score',
    ['pickle_jar variant', 'emails variant', 'features variant'],
    ['pandas', 'numpy', 'xgboost', 'scikit-learn'],
    'string',
    'score',
$$
import numpy as np
import pandas as pd
import xgboost as xgb
import pickle
import codecs
import json


def score(model, emails, features):
    # load model
    model = model[0] if not isinstance(model, str) else model
    model = pickle.loads(codecs.decode(model.encode(), "base64"))

    # retrieve the XGBoost trainer from the pickle jar
    bst = model[0]

    # retrieve the fitted one-hot-encoder from the pickle jar
    ohe2 = model[1]

    # create pandas dataframe from the inference features
    Y = pd.DataFrame(features)

    # select the categorical attributes and one-hot-encode them
    Y1 = Y.select_dtypes(include=[object])
    Y2 = ohe2.transform(Y1)

    # select the non-categorical attributes
    Y3 = Y.select_dtypes(exclude=[object])

    # join the results of the one-hot encoding to the rest of the attributes
    Y_pred = np.concatenate((Y2.toarray(), Y3.to_numpy()), axis=1)

    # inference
    dscore = xgb.DMatrix(Y_pred)
    pred = bst.predict(dscore)

    retval = list(zip(np.array(emails), list(map(str, pred))))
    retval = [{"email": r[0], "score": r[1]} for r in retval]
    return json.dumps(retval)  
$$);
Copy

备注

将 Python 加载到 Clean Room 中会为 Clean Room 创建一个新补丁。如果 Clean Room 分布设置为 EXTERNAL,则需要等待安全扫描完成,然后使用以下方式更新默认发布指令:

-- See the versions available inside the cleanroom
SHOW VERSIONS IN APPLICATION PACKAGE samooha_cleanroom_UI_Registration_ML_clean_room;

-- Once the security scan is approved, update the release directive to the latest version
CALL samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', '2');
Copy

添加自定义相似建模模板

要将自定义分析模板添加到 Clean Room 中,您需要在提供商端和使用者端提供表名占位符,以及提供者端的联接列。在 SQL Jinja 模板中,这些占位符必须始终为以下值:

  • source_table:来自提供商的表名称 数组

  • my_table:来自使用者的表名称 数组

通过使用这些变量,可以使表名称动态化,但是如果需要,也可以使用链接到 Clean Room 的视图的名称将其硬编码到模板中。如果需要,列名称可以硬编码到模板中,也可以通过参数动态设置。如果通过参数设置列名称,请记住,您需要调用参数 dimensionsmeasure_column,这些参数必须是数组,以便根据列策略进行检查。您可以将其作为 SQL Jinja 参数添加到模板中,之后在查询时由使用者传递。联接策略确保使用者不能联接除授权列之外的列。

另外,还可以使用以下筛选器检查自定义 SQL Jinja 模板中的实参是否符合联接和列策略:

  • join_policy:检查字符串值或筛选器子句是否符合联接策略

  • column_policy:检查字符串值或筛选器子句是否符合列策略

  • join_and_column_policy:检查筛选器子句中用于联接的列是否符合联接策略,以及用作筛选器的列是否符合列策略

例如,在子句 {{ provider_id | sqlsafe | join_policy }} 中,将解析 HEM 的输入以检查联接策略中是否有 HEM。注意:只能谨慎使用 sqlsafe 筛选器,因为它允许合作者将纯 SQL 放入模板。

备注

必须使用这些实参来引用所有提供商/使用者表,因为实际关联到 Clean Room 的安全视图名称与表名不同。重要的是,提供商表别名 MUST 为 p(或 p1)、p2、p3、p4 等。使用者表别名 必须 为 c(或 c1)、c2、c3 等。要在 Clean Room 中执行安全策略,必须满足此条件。

请注意,此函数将替换任何具有相同名称的现有模板。如果您想更新任何现有模板,只需使用更新后的模板再次调用这个函数。

从提供商数据集中选取一组特征,从使用者数据集中选出一组标签以及一个“高价值”标志(称为 label_value)。然后将这 2 个表内部联接在电子邮件上,并传递给随机森林训练算法。最后,将模型训练步骤的输出结果传递给推理函数,该函数利用训练好的模型来“推断”NOT 使用者数据集中的哪些提供商客户可能是“高价值”客户。然后返回此类个体的 数量 以及模型误差。

确定客户是否“可能是高价值”客户的分数阈值在模板中手动设置为 0.5。在将模板添加到 Clean Room 时,可以轻松更改此设置。

CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template($cleanroom_name, 'prod_custom_lookalike_template',
$$
WITH
features AS (
    SELECT
        identifier({{ provider_join_col | join_policy }}) AS joincol,
        array_construct({{ dimensions[0] | sqlsafe }} {% for feat in dimensions[1:] %} , {{ feat | sqlsafe }} {% endfor %}) AS features
    FROM
        identifier({{ source_table[0] }}) AS p
),
labels AS (
    SELECT
        c.{{ consumer_join_col | sqlsafe }} AS joincol,
        c.{{ filter_column | default('SALES_DLR') | sqlsafe }} {{ operator | default('>=') | sqlsafe }} {{ filter_value | default(2000) | sqlsafe }} AS label_value
    FROM
        identifier({{ my_table[0] }}) AS c
),
trained_model AS (
    SELECT
        train_out:model::varchar AS model,
        train_out:error::float AS error
    FROM (
      SELECT
        cleanroom.{{ lookalike_train_function | default('lookalike_train') | sqlsafe }}(array_agg(f.features), array_agg(l.label_value)) AS train_out
      FROM features f, labels l
      WHERE f.joincol = l.joincol
    )
),
inference_output AS (
    SELECT
        MOD(seq4(), 100) AS batch,
        cleanroom.{{ lookalike_score_function | default('lookalike_score') | sqlsafe }}(
            array_agg(distinct t.model), 
            array_agg(identifier({{ provider_join_col | join_policy }})), 
            array_agg(array_construct( identifier({{ dimensions[0] }}) {% for feat in dimensions[1:] %} , identifier({{ feat }}) {% endfor %}) )
        ) AS scores
    FROM trained_model t, identifier({{ source_table[0] }}) p
    WHERE identifier({{ provider_join_col | join_policy }}) NOT IN (SELECT c.{{ consumer_join_col | sqlsafe }} FROM identifier({{ my_table[0] }}) c)
    GROUP BY batch
),
processed_output AS (
    SELECT value:email::string as id, value:score::float AS score FROM (select scores from inference_output), lateral flatten(input => parse_json(scores))
), train_results AS (
    SELECT {{ num_boosting_rounds | sqlsafe }} AS num_boosting_rounds, {{ trim_extremes | sqlsafe }} AS trim_extremes, p.audience_size AS audience_size, t.error AS error FROM (SELECT count(distinct id) AS audience_size FROM processed_output WHERE score > 0.5) p, trained_model t
), seed_size AS (
    select count(*) AS seed_audience_size FROM features f, labels l WHERE f.joincol = l.joincol
)
SELECT s.seed_audience_size, t.audience_size AS num_lookalikes_found, t.error FROM train_results t, seed_size s
$$);

-- Last parameter (Differential Privacy) is optional and omitted here. Default is 1
Copy

如果要查看 Clean Room 中当前活跃的模板,请调用以下过程。您可以进行修改,以便在分析中启用差分隐私保证。您选择编写的任何自定义模板都可以采用类似的模式。

CALL samooha_by_snowflake_local_db.provider.view_added_templates($cleanroom_name);
Copy

设置每个模板的列策略

添加自定义模板后,您可以将列策略应用到该模板定义的所有表列。

要查看使用者可用的表的前 10 行,请运行以下查询:

SELECT * FROM <PROVIDER_TABLE> LIMIT 10;
Copy

为每个表和模板组合设置要分组、汇总(例如 SUM/AVG)和通常用于分析的列。这提供了灵活性,使同一个表可以根据基础模板允许不同的列选择。只有在添加模板后才可调用此过程。

请注意,set_column_policy 不可添加;如果再次调用函数,新的列策略会完全替换之前的列策略。

不应将列策略用于 email、HEM、RampID 等身份列,因为您不希望使用者能够按这些列进行分组。在生产环境中,系统会智能推断 PII 列并阻止此操作,但在沙盒环境中此功能不可用。它应该只用于您希望使用者能够汇总和分组的列,如状态、年龄段、地区代码、活动天数等。

请注意,要使“column_policy”和“join_policy”对使用者分析请求执行检查,在 SQL Jinja 模版中,所有列名 MUST 称为 dimensionsmeasure_columns。确保使用这些标签来引用自定义 SQL Jinja 模板中要检查的列。

CALL samooha_by_snowflake_local_db.provider.set_column_policy($cleanroom_name, [
    'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:status', 
    'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:age', 
    'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:region_code', 
    'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:days_active', 
    'prod_custom_lookalike_template:samooha_provider_sample_database.lookalike_modeling.customers:income_bracket'
]);
Copy

如果要查看已添加到 Clean Room 的列策略,请调用以下过程。

CALL samooha_by_snowflake_local_db.provider.view_column_policy($cleanroom_name);
Copy

创建并应用模板 UI

然后,您将定义模板 UI,让使用者可以在浏览器中使用:

  1. 调用 provider.add_ui_form_customizations 命令来定义模板在 Web 应用程序中的显示方式。

  2. 以提供商身份登录 Web。

定义模板 UI

provider.add_ui_form_customizations 命令定义了 Clean Room 模板在 Web 应用程序中的显示方式。有关可用于设计用户界面的自定义功能的完整说明,请参阅提供商 API 引用中的 Clean Room UI 更新命令 部分。

备注

您可以 选择 使用 warehouse_hints 自定义功能来控制使用者账户使用哪种仓库 来运行分析。例如,对于大多数机器学习用例,Snowflake 建议指定一个 Snowpark 优化型仓库。有关 warehouse_size 的有效值,请参阅 CREATE WAREHOUSE

在本例中,执行 provider.add_ui_form_customizations 命令,并进行以下自定义操作:

CALL samooha_by_snowflake_local_db.provider.add_ui_form_customizations(
    $cleanroom_name,
    'prod_custom_lookalike_template',
    {
        'display_name': 'Custom Lookalike Template',
        'description': 'Use our customized ML techniques to find lookalike audiences.',
        'methodology': 'Specify your own seed audience, while matching against our users. Then customize the lookalike model across number of boosting rounds and removing outliers.',
        'warehouse_hints': {
            'warehouse_size': 'medium',
            'snowpark_optimized': TRUE
        }
    },
    {
    'num_boosting_rounds': {
        'display_name': 'Number of Boosting Rounds',
        'type': 'integer',
        'default': 10,
        'order': 7,
        'description': 'How many rounds of boosting should the model do?',
        'size': 'M',
        'group': 'Training & Inference Configuration'
    },
    'trim_extremes': {
        'display_name': 'Trim Extremes',
        'type': 'boolean',
        'default': False,
        'order': 8,
        'description': 'Remove outliers by default?',
        'size': 'M',
        'group': 'Training & Inference Configuration'
    },
    'lookalike_train_function': {
        'display_name': 'Training Function',
        'choices': ['lookalike_train'],
        'type': 'dropdown',
        'order': 9,
        'description': 'Which function do you want to use for training?',
        'size': 'M',
        'group': 'Training & Inference Configuration'
    },
    'lookalike_score_function': {
        'display_name': 'Scoring Function',
        'choices': ['lookalike_score'],
        'type': 'dropdown',
        'order': 10,
        'description': 'Which function do you want to use for scoring?',
        'size': 'M',
        'group': 'Training & Inference Configuration'
    },    
    'provider_join_col': {
        'display_name': 'Provider Join Column',
        'choices': ['p.HASHED_EMAIL'],
        'type': 'dropdown',
        'order': 4,
        'description': 'Select the provider column to join users on.',
        'infoMessage': 'We recommend using HASHED_EMAIL.',
        'size': 'M',
        'group': 'Enable Provider Features'
    },
    'consumer_join_col': {
        'display_name': 'Consumer Join Column',
        'description': 'Specify column in your table that matches the providers (i.e. HASHED_EMAIL).',
        'size': 'M',
        'default': 'HASHED_EMAIL',
        'infoMessage': 'We recommend using HASHED_EMAIL.',
        'order': 5,
        'group': 'Enable Provider Features'
    },
    'dimensions': {
        'display_name': 'Feature Selection',
        'choices': ['p.STATUS', 'p.AGE', 'p.REGION_CODE', 'p.DAYS_ACTIVE'],
        'type': 'multiselect',
        'order': 6,
        'description': 'What features do you want to train on?',
        'infoMessage': 'We recommend selecting all features for maximum signal.',
        'size': 'M',
        'group': 'Enable Provider Features'
    },
    'filter_column': {
        'display_name': 'Filter Column',
        'type': 'any',
        'order': 1,
        'description': 'Specify column in your table to filter for high value users (i.e. SALES_DLR)',
        'size': 'S',
        'default': 'SALES_DLR',
        'infoMessage': 'We recommend you input SALES_DLR over here.',
        'group': 'Seed Audience Selection'
    },
    'operator': {
        'display_name': 'Operator',
        'choices': ['>=', '=', '<='],
        'type': 'dropdown',
        'order': 2,
        'description': 'What is the operator your want to use for the filter?',
        'size': 'S',
        'group': 'Seed Audience Selection'
    },
    'filter_value': {
        'display_name': 'Filter Value',
        'order': 3,
        'description': 'What value do you want to filter to?',
        'default': 2000,        
        'size': 'S',
        'group': 'Seed Audience Selection'
    }
}, {
    'measure_columns': ['seed_audience_size', 'audience_size', 'num_lookalikes_found', 'error'],
    'default_output_type': 'BAR'
});
Copy

与使用者共享

最后,通过添加数据使用者的 Snowflake 账户定位器和账户名称,将数据使用者添加到 Clean Room,如下所示。Snowflake 账户名称的格式必须为 <ORGANIZATION>.<ACCOUNT_NAME>。

备注

为了调用以下过程,请确保首先使用 provider.set_default_release_directive 设置发布指令。您可以使用以下方式查看最新的可用版本和补丁:

SHOW VERSIONS IN APPLICATION PACKAGE samooha_cleanroom_UI_Registration_ML_clean_room;
Copy
CALL samooha_by_snowflake_local_db.provider.add_consumers($cleanroom_name, '<CONSUMER_ACCOUNT_LOCATOR>', '<CONSUMER_ACCOUNT_NAME>');
CALL samooha_by_snowflake_local_db.provider.create_or_update_cleanroom_listing($cleanroom_name);
Copy

如果要启用提供商运行分析, 请在调用 add_consumers 后和调用 create_or_update_cleanroom_listing 前,调用 enable_provider_run_analysis

重要

每当更改 Clean Room 中的重要信息(如 UI、策略或数据集)时,请务必调用 provider.create_or_update_cleanroom_listing 更新生产中的 Clean Room。对于生产者和使用者来说,更改最多需要 10 分钟的时间才会显示在 UI 中。

Helper 方法

下面是一些有助于创建 Clean Room 的辅助函数。

对于多个使用者账户定位器,可以用逗号分隔的字符串形式传递到 provider.add_consumers 函数中,也可以分别调用 provider.add_consumers

如果要查看已添加到此 Clean Room 的使用者,请调用以下过程。

CALL samooha_by_snowflake_local_db.provider.view_consumers($cleanroom_name);
Copy

如果想查看最近创建的 Clean Room,请使用以下过程。

CALL samooha_by_snowflake_local_db.provider.view_cleanrooms();
Copy

如果想更深入地了解您创建的 Clean Room,请使用以下过程。

CALL samooha_by_snowflake_local_db.provider.describe_cleanroom($cleanroom_name);
Copy

创建的任何 Clean Room 也都可以删除。以下命令将完全删除 Clean Room,因此以前有权访问 Clean Room 的任何使用者都将无法再对其进行使用。如果将来需要使用相同名称的 Clean Room,则必须按照上述流程重新初始化。

CALL samooha_by_snowflake_local_db.provider.drop_cleanroom($cleanroom_name);
Copy

使用者流程

您作为提供商刚刚创建的 Clean Room 现在可以在使用者 Clean Room 环境的 Web 应用程序中使用。

备注

您可以继续在提供商账户中修改 UI 表单,然后实时查看使用者 Clean Room 环境的变化。

在 Web 应用程序中访问使用者账户

要以使用者身份登录 Clean Room,请执行以下步骤:

  1. 登录 Snowflake Data Clean Room 的 Web 应用程序。有关详细信息,请参阅 Snowflake Data Clean Room:Web 应用程序

  2. 输入电子邮件地址,然后选择 Continue。

  3. 输入密码。

  4. 选择与使用者账户相关联的 Snowflake 账户。

安装 Clean Room

在 Clean Room 页面,找到与您刚刚创建的 Clean Room 对应的磁贴,然后选择 Install

运行分析

要在 Clean Room 中运行分析,请执行以下步骤:

  1. Clean Room 页面上,找到新 Clean Room 的磁贴并选择 Run

  2. 选择要运行的分析或查询,然后选择 Proceed

  3. 为所选分析配置必填字段,可以选择一个仓库大小,然后选择 Run

  4. 可选择提供分析名称。如果要定期运行分析,请选择时间间隔,否则请选择 Off,即表示仅运行一次分析。

  5. 选择 Save 开始运行分析。

  6. 选择 View all analyses 以查看计划分析、正在运行的分析和完成分析列表,包括您刚刚创建的分析。

  7. 分析完成后,将其选中即可查看结果。

语言: 中文