Snowflake Data Clean Rooms: ユーザーインターフェイスによるカスタム分析テンプレートの作成

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

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

クリーンルームに複数のカスタムテンプレートを適用することができ、それぞれのテンプレートはコンシューマー向けのウェブアプリに表示されます。

これは、 UI でクリーンルームを作成し、共有するための一般的な流れです。

  • プロバイダー:

    1. 使用する適切なロールやウェアハウスの指定など、コーディング環境のセットアップを行います。

    2. クリーンルームを作成し、クリーンルームに必要なクロスリージョン共有を有効にします。

    3. クリーンルームにデータを追加し、テーブルに結合ポリシーをセットします。

    4. 必要なカスタムスクリプトを追加します。

    5. テンプレートに列ポリシーをセットします。

    6. テンプレートの UI を作成し、ウェブアプリに適用します。

    7. クリーンルームをコンシューマーと共有します。

  • コンシューマー:

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

前提条件

このフローを完了するには、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_or_update_cleanroom_listing コマンドを実行しようとする前にリリースディレクティブをセットしていれば、セキュリティスキャン中もコマンドを実行し続けることができます。

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

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

クロスリージョンの共有

お客様のアカウントと異なるリージョンにあるSnowflakeのお客様とクリーンルームを共有するには、クロスクラウド自動フルフィルメントを有効にする必要があります。他リージョンのコンシューマーとの協業に関連する追加コストに関する情報については、クロスクラウド自動フルフィルメントのコストをご参照ください。

開発者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_or_update_cleanroom_listing コマンドを使用して、通常通りコンシューマーをリストに追加することができます。リストは、必要に応じて自動的にリモートクラウドやリージョンに複製されます。

データの追加と結合ポリシーのセット

Snowflakeテーブルをクリーンルームにリンクし、Snowflakeアカウントのテーブルリストを参照し、完全修飾テーブル名(Database.Schema.Table)を配列として入力します。この手順では、クリーンルーム内からテーブルの安全な表示を作成することで、テーブルを自動的にクリーンルームにアクセスできるようにし、テーブルのコピーを作成する必要がなくなります。

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

クリーンルームにリンクされたデータセット名を表示するには、以下のプロシージャを呼び出します。

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

クリーンルームにリンクされているデータセットは、以下のクエリで見ることができます。

SELECT * FROM <PROVIDER_TABLE> LIMIT 10;
Copy

クリーンルーム内でテンプレートを実行する際に、コンシューマーが参加できる列を指定します。このプロシージャはemailのようなID列に対して呼び出される必要があります。結合ポリシーは「置換のみ」であるため、この関数が再度呼び出されると、以前に設定された結合ポリシーは新しいものに完全に置き換えられます。

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

カスタムコードの追加

クリーンルームに機密機械学習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テンプレートを追加する

クリーンルームにカスタム分析テンプレートを追加するには、プロバイダー側とコンシューマー側の両方でテーブル名のプレースホルダーとプロバイダー側の結合列が必要です。JinjaSQL テンプレートでは、コンシューマーはテンプレートの実行時にプロバイダーとコンシューマーのテーブル名のリストを渡します。これらのリストは以下のグローバル変数に割り当てられ、コンシューマーによってテンプレートで利用可能です

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

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

テンプレートはこれらの変数を使用してテーブル名を動的にすることができます。また、テンプレートで使用したいテーブルが明確な場合(およびテーブルが存在し、期待どおりに名前が付けられている場合)は、テーブル名をハードコードすることもできます。

列名はテンプレートにハードコードするか、コンシューマーが提供する引数によって動的にセットすることもできます。これらを 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
$$);

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

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

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

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

テンプレートの UI の作成と適用

次に、コンシューマーがブラウザで使用できるように、テンプレートの UI を定義します。

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

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

テンプレートの UI の定義

provider.add_ui_form_customizations コマンドは、クリーンルームのテンプレートがウェブアプリでどのように表示されるかを定義します。ユーザーインターフェイスのデザインに使用できるカスタマイズの完全な説明については、プロバイダー API リファレンスのクリーンルーム 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アカウントロケータとアカウント名を追加して、データコンシューマーをクリーンルームに追加します。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

プロバイダーが実行する分析を有効にしたい場合は、 enable_provider_run_analysisを、 add_consumers を呼び出した後、 create_or_update_cleanroom_listing を呼び出す前に呼び出します。

重要

UI、ポリシー、データセットなど、クリーンルームの重要な情報を変更するときは、必ずprovider.create_or_update_cleanroom_listingを呼び出して、実稼働のクリーンルームを更新してください。プロデューサーとコンシューマーの双方にとって、 UI に変更が反映されるまでに最大10分かかることがあります。

ヘルパーメソッド

クリーンルームの作成に役立つヘルパー関数をご紹介します。

複数のコンシューマーアカウントロケーターを、カンマ区切りの文字列として 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. 実行する分析またはクエリを選択し、[続行する]を選択します。

  3. 選択した分析に必要なフィールドを構成し、オプションでウェアハウスサイズを選択し、[実行]を選択します。

  4. オプションで分析名を指定します。定期的に分析を実行したい場合は、期間を選択します。そうでない場合は、[オフ]を選択して、分析を1回だけ実行します。

  5. [保存]を選択し、分析を開始します。

  6. [すべての分析を表示]を選択すると、作成したばかりの分析も含め、スケジュール済み、実行中、完了した分析のリストが表示されます。

  7. 分析が完了したら、それを選択して結果をご覧ください。