Snowflake Data Clean Rooms: 開発者 API テンプレートをウェブアプリに登録する

このトピックでは、プロバイダーが、コンシューマーがウェブアプリで分析を実行するために使用できるユーザーインターフェイスを提供しながら、クリーンルームをプログラムで作成し、コンシューマーと共有する方法について説明します。これは機械学習フローと似ていますが、複雑な機械学習ワークフローにユーザーインターフェイスを提供する方法を示しています。プロバイダーがクリーンルームをウェブアプリに登録した後、利用者はSnowsightや開発者APIsを使用する必要がなく、技術者でないコンシューマーがカスタマイズされた複雑なクリーンルームを使用することができます。

プロバイダーは、クリーンルームのカスタムテンプレートを複数登録することができ、それぞれのテンプレートはコンシューマー向けのウェブアプリに表示されます。プロバイダーは、関連する APIs を複数回呼び出すだけです。

このフローでは、以下の内容について説明します。

  1. プロバイダー:

    a.Lookalike Modeling分析を実行するカスタムテンプレートを追加する。

    b.XGBoostを活用した機械学習pythonコードベースのテンプレートを安全に追加する。

    c.カスタムテンプレートを使用して、クリーンルーム内の機械学習UDFsを呼び出す。

    d.ウェブアプリでカスタマイズされたUIフォームでクリーンルームを登録します。

  2. コンシューマー:

    a.ウェブアプリを使用してクリーンルームをインストールし、分析を実行します。

注釈

Lookalike Modeling とは、コンシューマーがプロバイダーの高額顧客に統計モデルをトレーニングすることで、プロバイダーのデータから「高額」顧客を見つけようとする分析の一種です。このモデルでは、コンシューマーが指定したフラグを使用して、コンシューマーのデータセットに含まれる、ある閾値以上の支出を持つユーザーなど、価値の高いユーザーを示します。学習されたモデルは、プロバイダーのデータから、コンシューマーにとって「価値の高い」可能性のある顧客を推測するために使用されます。

前提条件

このフローを完了するには、2つの別々のSnowflakeアカウントが必要です。プロバイダーのコマンドを実行するために最初のアカウントを使用し、コンシューマーのコマンドを実行するために2番目のアカウントに切り替えます。

プロバイダー

プロバイダーアカウントのSnowflakeワークシートを使用して、このセクションのコマンドを実行します。

環境の設定

開発者APIsを使用する前に、SAMOOHA_APP_ROLEロールを引き受け、APIsの実行に使用するウェアハウスを指定する必要があります。SAMOOHA_APP_ROLEロールを持ってない場合は、アカウント管理者にお問い合わせください。

以下のコマンドを実行して環境を設定します。

USE ROLE samooha_app_role;
USE WAREHOUSE app_wh;
Copy

クリーンルームの作成

クリーンルームを作成する前に、クリーンルームの 英数字 名を指定する必要があります。名前には、スペースとアンダースコア以外の特殊文字を含めることはできません。クリーンルームの名称は、既存のクリーンルームと重複しないようにしてください。

クリーンルームの名前を指定するには、以下のコマンドを実行します。

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

これで、 provider.cleanroom_init コマンドを実行してクリーンルームを作成する準備ができました。2番目の引数は、クリーンルームの分布を定義します。この例では、クリーンルームをコラボレーターに解放する前に行われる自動セキュリティスキャンをバイパスするために、INTERNALに設定します。INTERNAL配布方法を使用するには、プロバイダーとコンシューマーのアカウントが同じ組織内にある必要があります。別の組織のアカウントにクリーンルームを配布する場合は、EXTERNALの配布を使用する必要があります。

クリーンルームを作成するには、以下のコマンドを実行します。

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

クリーンルームを作成した後、コラボレーターと共有する前にリリースディレクティブを設定する必要があります。

注釈

クリーンルームの配布をEXTERNALに設定する場合、リリース指令を設定する前に、セキュリ ティスキャンが完了するのを待つ必要があります。を実行すると、セキュリティスキャンのステータスを表示できます。

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

provider.create_cleanroom_listing コマンドを実行しようとする前にreleaseディレクティブを設定していれば、セキュリティスキャン中もコマンドを実行し続けることができます。

クリーンルームのリリースディレクティブを設定するには、以下のコマンドを実行します。

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

クロスリージョンの共有

顧客のアカウントと異なる地域にアカウントを持つSnowflakeの顧客とクリーンルームを共有するには、Cross-Cloud Auto-Fulfillmentを有効にする必要があります。他地域のコンシューマーとの協業に関連する追加コストについては、Cross-Cloud Auto-Fulfillment costsをご参照ください。

開発者APIsを使用する場合、クロスリージョン共有を有効にするには2つのステップがあります。

  1. ACCOUNTADMINロールを持つSnowflake管理者は、Snowflake アカウントのクロスクラウド自動複製を有効にします。手順については、異なるリージョンのアカウントと連携するをご参照ください。

  2. プロバイダーは、 provider.enable_laf_for_cleanroom コマンドを実行して、クリーンルームのクロスクラウド自動複製を有効にします。例:

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

クリーンルームのクロスクラウド自動複製を有効にした後、 provider.create_cleanroom_listing コマンドを使用して、通常通りリストにコンシューマーを追加できます。リストは、必要に応じて自動的にリモートクラウドやリージョンに複製されます。

クリーンルームに機密機械学習Pythonコードを追加する

類似した作業のために、MLクリーンルームにpython関数をいくつかロードします。クリーンルームにインストールされたすべてのPython関数は完全に機密です。コンシューマーには見えません。

次のAPIを使うことにより、Python関数をインライン関数としてクリーンルームに直接定義することができます。あるいは、クリーンルームステージにアップロードしたステージングされたファイルからPythonをロードすることもできます。例については[API リファレンスガイド](../provider)をご参照ください。

注釈

この実装は、ARRAY_AGG(すなわち16MB)によって集計できるデータ量に対するSnowflakeの合計サイズの制約によって制限されることに注意してください。バッチングを使用して任意のサイズのデータセットに拡張できるバッチングとストリーミングモデルを活用した実装は、 リクエストに応じて利用可能 です。

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

では、クリーンルームにスコアリング関数を導入してみましょう。

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をクリーンルームにロードすると、クリーンルーム用の新しいパッチが作成されます。クリーンルームのディストリビューションが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

カスタムLookalike Modelingテンプレートを追加する

クリーンルームにカスタム分析テンプレートを追加するには、プロバイダー側とコンシューマー側の両方でテーブル名のプレースホルダーとプロバイダー側の結合列が必要です。SQL Jinjaテンプレートでは、これらのプレースホルダーは次のものである必要があります。

  • source_table:プロバイダーのテーブル名の 配列

  • my_table:コンシューマーのテーブル名の 配列

テーブル名は、これらの変数を使用して動的にすることができますが、クリーンルームにリンクされた表示名を使用して、必要に応じてテンプレートにハードコード化することもできます。列名はテンプレートにハードコード化することも、パラメーターで動的に設定することもできます。パラメーターを使用して設定する場合は、列ポリシーと照合するために、パラメーターの dimensions または measure_column を配列として呼び出す必要があることにご留意ください。これらを SQL Jinjaパラメーターとしてテンプレートに追加します。これらは後でクエリ時にコンシューマーから渡されます。結合ポリシーは、許可された列以外の列でコンシューマーにより結合できないようにします。

また、SQL Jinjaテンプレートのカスタム引数は、以下のフィルターを使用して、結合および列のポリシーに準拠しているかどうかを確認することができます。

  • join_policy: 文字列値またはフィルター句が結合ポリシーに準拠しているかどうかを確認します。

  • column_policy: 文字列値またはフィルター句が列ポリシーに準拠しているかどうかを確認します。

  • join_and_column_policy: フィルター句で結合に使用される列が結合ポリシーに準拠しているか、また、フィルターとして使用される列が列ポリシーに準拠しているかを確認します。

たとえば、 {{provider_id | sqlsafe | join_policy }} 句では、 p.HEM の入力が解析され、 p.HEM が結合ポリシーにあるかどうかが確認されます。注意: sqlsafe フィルターでは、コラボレーターが純粋な SQL をテンプレートに入れることができるため、使用には注意してください。

注釈

クリーンルームに実際にリンクされているセキュアビューの名前はテーブル名と異なるため、すべてのプロバイダー/コンシューマーテーブルは、これらの引数を使用して参照する必要があります。重要なのは、プロバイダーテーブルのエイリアスはp(またはp1)、p2、p3、p4などにする 必要 があり、コンシューマーテーブルのエイリアスはc(またはc1)、c2、c3などにする 必要 があるということです。これは、クリーンルームのセキュリティポリシーを実施するために必要です。

この関数は、同じ名前の既存のテンプレートを上書きすることに注意してください。既存のテンプレートを更新したい場合は、更新されたテンプレートでこの関数を再度呼び出します。

一連の機能はプロバイダーデータセットから選択され、一連のラベルはコンシューマーデータセットから選択されます。これらの2つのテーブルは、メール上で内部結合され、Random Forest学習アルゴリズムに渡されます。最後に、モデル学習ステップの出力は推論関数に渡されます。推論関数は、学習済みモデルを使用して、コンシューマーデータセットのプロバイダー顧客NOTのうち、どれが「高価値」であるかを「推論」します。そして、そのような個人の カウント数 が、モデルエラーとともに返されます。

顧客が「高価値である可能性が高い」と判断するスコアを決定するための閾値は、テンプレート内で0.5に手動設定されています。これはクリーンルームにテンプレートを追加する際に簡単に変更できます。

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
$$);
Copy

注釈

上記のsamooha_by_snowflake_local_db.provider.add_custom_sql_templateプロシージャの呼び出しの最後のパラメータとして、Differential Privacy sensitivityを追加することができます。追加しない場合、デフォルトは1です。

クリーンルームで現在有効なテンプレートを表示したい場合は、以下の手順を呼び出します。分析で差分プライバシー保証を有効にするための修正を行うことができます。同じようなパターンを、選んだカスタムテンプレートにも取り入れることができます。

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

各テーブルに列ポリシーを設定する

テーブル内の列を確認するためにリンクされたデータを表示します。上位10行を表示するには、以下のプロシージャを呼び出します。

SELECT * FROM <PROVIDER_TABLE> LIMIT 10;
Copy

グループ化および集計できる列を設定し(例:SUM/AVG)、すべてのテーブルとテンプレートの組み合わせについて、一般的に分析で使用します。これにより、同じテーブルでも基本テンプレートによって異なる列選択ができる柔軟性が生まれます。これはテンプレートを追加した後にのみ呼び出する必要があります。

列ポリシーは 置換のみ であることに注意してください。したがって、この関数が再度呼び出された場合、以前に設定された列ポリシーは新しいものに完全に置き換えられます。

列ポリシーは、email、HEM、RampIDなどのID列では使用しないでください。コンシューマーがこれらの列でグループ化できないようにするためです。実稼働環境では、システムはインテリジェントにPII列を推測し、この操作をブロックしますが、この機能はサンドボックス環境では利用できません。Status、Age Band、Region Code、Days Activeなどのように、コンシューマーに集計やグループ化させる列にのみ使用してください。

「column_policy」と「join_policy」がコンシューマー分析リクエストのチェックを実行するために、SQL Jinjaテンプレートでは、すべての列名が dimensions または measure_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

クリーンルームに追加された列ポリシーを表示したい場合は、次の手順を呼び出します。

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

コンシューマーと共有する

最後に、以下のようにSnowflakeアカウントロケータとアカウント名を追加して、データコンシューマーをクリーンルームに追加します。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_cleanroom_listing($cleanroom_name, '<CONSUMER_ACCOUNT_NAME>');
Copy

ウェブアプリでクリーンルームを登録

クリーンルームがコンシューマーと共有されたので、カスタムテンプレートを登録し、ウェブアプリでコンシューマーが利用できるようにします。つまり、コンシューマーは、開発者APIsを使用することなく、ユーザーインターフェイスを通じて、複雑な機械学習コードに裏打ちされたものを含むカスタム分析を実行することができます。

コンシューマーがウェブアプリでアクセスできるようにクリーンルームを登録するには、3つのステップがあります。次のことを行ってください:

  1. provider.add_ui_form_customizations コマンドを呼び出して、ウェブアプリでのテンプレートの表示方法を定義します。

  2. provider.register_cleanroom_in_ui コマンドを呼び出してテンプレートを登録します。

  3. プロバイダーとしてウェブにサインインします。

テンプレートのユーザーインターフェースの作成

provider.add_ui_form_customizations コマンドは、クリーンルームのテンプレートがウェブアプリでどのように表示されるかを定義します。ユーザー インターフェイスの設計に使用できるカスタマイズの包括的な説明については、プロバイダー API リファレンスの[クリーンルーム UI 登録方法](https://docs.snowflake.com/en/user-guide/cleanrooms/provider#clean-room-ui-registration-methods)セクションをご参照ください。

注釈

コンシューマーアカウントがどの種類のウェアハウスを使用して分析を実行するかを制御するために、 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

テンプレートの登録

ウェブアプリでテンプレートがどのように見えるかを定義したら、 provider.register_cleanroom_in_ui コマンドを実行してテンプレートを登録し、コンシューマーのクリーンルーム環境で利用できるようにします。

provider.register_cleanroom_in_ui コマンドは以下の引数を受け付けます。

  • クリーンルームの名称。

  • テンプレートの名前。

  • クリーンルームを共有するコンシューマーアカウント。

  • コンシューマーのクリーンルーム環境におけるウェブアプリユーザーのメールアドレス。Snowflakeは、確認のためにメールアドレスを使用します。

注釈

provider.register_cleanroom_in_ui コマンドは、 provider.add_consumers コマンドや provider.create_cleanroom_listing コマンドとは異なり、LOCATOR.REGION.CLOUD形式で指定されるコンシューマーアカウントのアカウント識別子全体を必要とします。このアカウント識別子を見つける方法については、識別子としてのアカウントロケーターの使用をご参照ください。

例は次のとおりです。

  • ABC01234.us-west-2.aws

  • XYZ01234.us-east-1.aws

  • MNO01234.west-us-2.azure

この例で作成したprod_custom_lookalike_templateテンプレートを登録するには、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.register_cleanroom_in_ui($cleanroom_name, 'prod_custom_lookalike_template', '<CONSUMER_ACCOUNT_IDENTIFIER>', '<CONSUMER_USER_EMAIL>');
Copy

過去の登録リクエストを確認するには、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.view_ui_registration_request_log();
Copy

ウェブアプリにサインインする

provider.register_cleanroom_in_ui コマンドを実行した後、プロバイダーは登録プロセスを完了するためにウェブアプリにサインインする必要があります。プロバイダーとしてウェブアプリにログインするまで、リクエストは「PENDING」状態のままです。ウェブアプリにサインインするには、Snowflake Data Clean Room: ウェブアプリをご参照ください。

ヘルパーメソッド

複数のコンシューマーアカウントロケーターを、カンマ区切りの文字列として provider.add_consumers 関数に渡すことも、 provider.add_consumers を個別に呼び出すこともできます。

このクリーンルームに追加されたコンシューマーを表示したい場合は、次の手順を呼び出します。

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

最近作成されたクリーンルームを表示したい場合は、以下の手順を使用してください。

CALL samooha_by_snowflake_local_db.provider.view_cleanrooms();
Copy

作成したクリーンルームについて、得られるインサイトを増やしたい場合は、次の手順を使用します。

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

作成されたクリーンルームは削除することもできます。次のコマンドはクリーンルームを完全に削除するので、以前クリーンルームにアクセスしていたコンシューマーはもうクリーンルームを使用することができません。将来、同じ名前のクリーンルームが必要な場合は、上記のフローを使用して再初期化する必要があります。

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

コンシューマーの流れ

プロバイダーとして作成したクリーンルームが、コンシューマーのクリーンルーム環境のウェブアプリで利用できるようになりました。

注釈

プロバイダーのアカウントでUIフォームを変更し、コンシューマーのクリーンルーム環境の変更をリアルタイムで確認することができます。

ウェブアプリでコンシューマーアカウントにアクセス

コンシューマーとしてクリーンルームにサインインするには:

  1. Snowflake Data Clean Roomのウェブアプリにサインインします。詳細については、Snowflake Data Clean Room: ウェブアプリをご参照ください。

  2. メールアドレスを入力し、[続行] を選択します。

  3. パスワードを入力してください。

  4. コンシューマーアカウントに関連付けられているSnowflakeアカウントを選択します。

クリーンルームをインストールする

[クリーンルーム] ページで、作成したばかりのクリーンルームに対応するタイルを見つけ、[インストール] を選択します。タイルは以下のようになります。

分析の実行

クリーンルームでの分析

  1. [分析&クエリ] ページで、[新規分析&クエリ] を選択します。

  2. 作成したカスタム類似テンプレートに対応するタイルを選択し、[次へ] を選択します。

  1. クリーンルームを選択し、[次へ] を選択します。

  2. クリーンルーム用に作成したカスタムフォームに必要事項を入力してください。