Snowflake データクリーンルーム:オーバーラップ分析¶
このトピックでは、クリーンルームをプログラムで設定し、コンシューマーと共有し、プロバイダー側のデータ分析を実行するために必要なプロバイダーとコンシューマーのフローについて説明します。プロバイダー側のデータ分析とは、コンシューマーが自分のデータセットを持ち込む必要はなく、単にプロバイダーのデータセットに関する集計されたインサイトを得たい場合です。
内容は以下の通りです。
プロバイダー:
a.新鮮なクリーンルーム作り
b.データセットをセキュアにリンクします。
c.どの列を結合し、分析に使用できるかを管理するポリシーを追加します。
d.定義済みのオーバーラップ解析テンプレートを有効にします。
e.コンシューマーとの共有。
コンシューマー:
a.プロバイダーに共有されるのクリーンルームのインストール。
b.クリーンルームにデータセットを追加します。
c.クリーンルーム内に用意されたテンプレートの検査。
d.テンプレートを使用してクリーンルーム内で分析を実行します。
前提条件¶
このフローを完了するには、2つの別々のSnowflakeアカウントが必要です。プロバイダーのコマンドを実行するために最初のアカウントを使用し、コンシューマーのコマンドを実行するために2番目のアカウントに切り替えます。
プロバイダー¶
注釈
以下のコマンドは、プロバイダーアカウントのSnowflakeワークシートで実行する必要があります。
環境の設定¶
開発者APIsを使用してSnowflake Data Clean Roomで作業する前に、以下のコマンドを実行してSnowflake環境をセットアップします。SAMOOHA_APP_ROLEロールを持ってない場合は、アカウント管理者にお問い合わせください。
use role samooha_app_role;
use warehouse app_wh;
クリーンルームの作成¶
クリーンルームの名称を作成します。既存のクリーンルーム名との衝突を避けるため、新しいクリーンルーム名を入力してください。クリーンルームの名前に使用できるのは 英数字 のみです。クリーンルーム名には、スペースとアンダースコア以外の特殊文字は使用できません。
set cleanroom_name = 'Overlap Analysis Demo Clean Room';
上記で設定したクリーンルーム名で新しいクリーンルームを作成できます。上記で設定したクリーンルーム名が既に既存のクリーンルームとして存在する場合、この処理は失敗します。
この手順には通常、約半分の時間がかかります。
provider.cleanroom_init の2番目の引数は、クリーンルームのディストリビューションです。これはINTERNALまたはEXTERNALのいずれかです。テスト目的で、同じ組織内のアカウントにクリーンルームを共有する場合、INTERNALを使用して、アプリケーションパッケージがコラボレーターにリリースされる前に実施されなければならない自動セキュリティスキャンをバイパスすることができます。ただし、このクリーンルームを別の組織のアカウントと共有する場合は、EXTERNALクリーンルーム配布を使用する必要があります。
call samooha_by_snowflake_local_db.provider.cleanroom_init($cleanroom_name, 'INTERNAL');
セキュリティスキャンのステータスを表示するには、以下を使用します。
call samooha_by_snowflake_local_db.provider.view_cleanroom_scan_status($cleanroom_name);
クリーンルームを作成したら、コラボレーターと共有する前にリリースディレクティブを設定する必要があります。しかし、ディストリビューションがEXTERNALに設定されている場合は、リリースディレクティブを設定する前に、まずセキュリティスキャンが完了するのを待つ必要があります。スキャンが完了するまでの間、残りのステップを実行し続け、 provider.create_cleanroom_listing ステップの前にここに戻ることができます。
リリースディレクティブを設定するには、次のようにします。
call samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', '0');
クロスリージョンの共有¶
顧客のアカウントと異なる地域にアカウントを持つSnowflakeの顧客とクリーンルームを共有するには、Cross-Cloud Auto-Fulfillmentを有効にする必要があります。他地域のコンシューマーとの協業に関連する追加コストについては、Cross-Cloud Auto-Fulfillment costsをご参照ください。
開発者APIsを使用する場合、クロスリージョン共有を有効にするには2つのステップがあります。
ACCOUNTADMINロールを持つSnowflake管理者は、Snowflake アカウントのクロスクラウド自動複製を有効にします。手順については、異なるリージョンのアカウントと連携するをご参照ください。
プロバイダーは、 provider.enable_laf_for_cleanroom コマンドを実行して、クリーンルームのクロスクラウド自動複製を有効にします。例:
call samooha_by_snowflake_local_db.provider.enable_laf_for_cleanroom($cleanroom_name);
クリーンルームのクロスクラウド自動複製を有効にした後、 provider.create_cleanroom_listing コマンドを使用して、通常通りリストにコンシューマーを追加できます。リストは、必要に応じて自動的にリモートクラウドやリージョンに複製されます。
データセットをリンクし、データセットの結合ポリシーを設定します。¶
Snowflakeテーブルをクリーンルームにリンクします。Snowflakeアカウントのテーブルリストを参照し、完全修飾テーブル名 (Database.Schema.Table) を配列として入力します。この手順では、クリーンルーム内からテーブルの安全な表示を作成することで、テーブルを自動的にクリーンルームにアクセスできるようにし、テーブルのコピーを作成する必要がなくなります。
call samooha_by_snowflake_local_db.provider.link_datasets($cleanroom_name, ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']);
注釈
テーブルが存在するにもかかわらずこの手順がうまくいかない場合、SAMOOHA_APP_ROLEロールにまだアクセス権が与えられていない可能性があります。もしそうであれば、ACCOUNTADMINロールに切り替え、データベース上で以下のプロシージャを呼び出します。
use role accountadmin;
call samooha_by_snowflake_local_db.provider.register_db('<DATABASE_NAME>');
use role samooha_app_role;
クリーンルームに追加されたデータセットを表示したい場合は、以下の手順を呼び出します。
call samooha_by_snowflake_local_db.provider.view_provider_datasets($cleanroom_name);
どの列を結合ポリシーとして使用するかを決定するために、データセットを見てPII列を決定することができます。上位10行を見るには、以下のクエリを実行します。
select * from SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS limit 10;
クリーンルーム内でテンプレートを実行する際に、コンシューマーが参加できる列を指定します。このプロシージャはemailのようなID列に対して呼び出される必要があります。結合ポリシーは「置換のみ」であるため、この関数が再度呼び出されると、以前に設定された結合ポリシーは新しいものに完全に置き換えられます。
call samooha_by_snowflake_local_db.provider.set_join_policy($cleanroom_name, ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HEM']);
クリーンルームに追加された参加ポリシーを表示したい場合は、次の手順を呼び出します。
call samooha_by_snowflake_local_db.provider.view_join_policy($cleanroom_name);
クリーンルームに分析テンプレートを追加する¶
名前識別子を使って定義済みテンプレートのリストを追加します。このフローでは、コンシューマーがプロバイダーが承認した列で、安全かつプロバイダーが承認した方法で、自分のデータセットとプロバイダーのデータセットの重複に関する分析を実行できるように、定義済みのテンプレートを追加します。
このテンプレートの重要な点は、 差分プライバシー によって提供される追加のセキュリティ保証をネイティブに実装していることです。詳細については[差分プライバシー](../differential-privacy)をご参照ください。
call samooha_by_snowflake_local_db.provider.add_templates($cleanroom_name, ['prod_overlap_analysis']);
クリーンルームで現在有効なテンプレートを表示したい場合は、以下の手順を呼び出します。分析で差分プライバシー保証を有効にするために必要な修正を確認できます。同じようなパターンを、選んだカスタムテンプレートにも取り入れることができます。
注釈
システム定義のプリセットテンプレートはすべて暗号化されており、デフォルトでは表示できないことに注意してください。ただし、追加したカスタムテンプレートはすべて表示されます。
call samooha_by_snowflake_local_db.provider.view_added_templates($cleanroom_name);
クリーンルームに追加されたテンプレートも、必要に応じて片付けることができます。詳細は、プロバイダーAPIリファレンスガイド をご参照ください。
各テーブルに列ポリシーを設定する¶
テーブル内の列を確認するためにリンクされたデータを表示します。上位10行を表示するには、以下のプロシージャを呼び出します。
select * from SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS limit 10;
コンシューマーがグループ化および集計できる列を設定し(例:SUM/AVG)、すべてのテーブルとテンプレートの組み合わせについて、一般的に分析で使用します。これにより柔軟性が生まれ、同じテーブルでも基礎となるテンプレートによって異なる列選択が可能になります。これはテンプレートを追加した後にのみ呼び出されるべきです。
列ポリシーは 置換のみ であることに注意してください。したがって、この関数が再度呼び出された場合、以前に設定された列ポリシーは新しいものに完全に置き換えられます。
列ポリシーは、email、HEM、RampIDなどのID列では使用しないでください。コンシューマーがこれらの列でグループ化できないようにするためです。実稼働環境では、システムはインテリジェントにPII列を推測し、この操作をブロックしますが、この機能はサンドボックス環境では利用できません。これは、Status、Age Band、Channel、Days Activeなどのように、コンシューマーに集計やグループ化してもらう列にのみ使用してください。
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']);
クリーンルームに追加された列ポリシーを表示したい場合は、次の手順を呼び出します。
call samooha_by_snowflake_local_db.provider.view_column_policy($cleanroom_name);
コンシューマー¶
注釈
以下のコマンドは、コンシューマーアカウントのSnowflakeワークシートで実行する必要があります。
環境の設定¶
開発者APIsを使用してSnowflake Data Clean Roomで作業する前に、以下のコマンドを実行してSnowflake環境をセットアップします。SAMOOHA_APP_ROLEロールを持ってない場合は、アカウント管理者にお問い合わせください。
use role samooha_app_role;
use warehouse app_wh;
クリーンルームをインストールする¶
クリーンルーム共有がインストールされると、利用可能なクリーンルームのリストは、以下のコマンドを使用して表示することができます。
call samooha_by_snowflake_local_db.consumer.view_cleanrooms();
プロバイダーが共有したクリーンルームの名前を割り当てます。
set cleanroom_name = 'Overlap Analysis Demo Clean room';
以下のコマンドは、関連するプロバイダーと選択されたクリーンルームを持つコンシューマーアカウントにクリーンルームをインストールします。プロバイダーのSnowflake アカウントロケーター を入力します(名前ではありません)。
この手順には少し時間がかかりますが、通常は30秒程度です。
call samooha_by_snowflake_local_db.consumer.install_cleanroom($cleanroom_name, '<PROVIDER_ACCOUNT_LOCATOR>');
クリーンルームが設置されると、プロバイダーはクリーンルームの使用を可能にする前に、プロバイダー側でクリーンルームの設定を完了しなければなりません。以下の関数でクリーンルームのステータスを確認できます。有効化されると、以下のRun Analysisコマンドを実行できるようになります。クリーンルームが有効になるまで、通常約1分かかります。
call samooha_by_snowflake_local_db.consumer.is_enabled($cleanroom_name);
データセットのリンク¶
これで、データセットのいくつかをクリーンルームにリンクして、データプロバイダーのデータを使ってセキュアな計算を実行することができます。
call samooha_by_snowflake_local_db.consumer.link_datasets($cleanroom_name, ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']);
注釈
テーブルが存在するにもかかわらずこの手順がうまくいかない場合、SAMOOHA_APP_ROLEロールにまだアクセス権が与えられていない可能性があります。もしそうであれば、ACCOUNTADMINロールに切り替え、データベース上で以下のプロシージャを呼び出します。
use role accountadmin;
call samooha_by_snowflake_local_db.consumer.register_db('<DATABASE_NAME>');
use role samooha_app_role;
分析を実行するには、コンシューマーテーブルを渡す必要があります。クリーンルームに追加したデータセットを表示したい場合は、以下のプロシージャを呼び出します。
call samooha_by_snowflake_local_db.consumer.view_consumer_datasets($cleanroom_name);
分析を実行する¶
クリーンルームがインストールされたので、プロバイダーからクリーンルームに与えられた分析テンプレートを"run_analysis"コマンドを使って実行することができます。各フィールドがどのように決定されるかについては、以下のセクションをご参照ください。
注釈
分析を実行する前に、ウェアハウスサイズを変更したり、テーブルが大きい場合は新しい大きなウェアハウスサイズを使用することができます。
-- Example run analysis procedure with single provider dataset
call samooha_by_snowflake_local_db.consumer.run_analysis(
$cleanroom_name, -- cleanroom
'prod_overlap_analysis', -- template name
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'], -- your tables
['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'], -- the provider table we want to carry out analysis on
object_construct( -- The keyword arguments needed for the SQL Jinja template
'dimensions', ['p.REGION_CODE'], -- Group by column
'measure_type', ['AVG'], -- Aggregate function you want to perform like COUNT, AVG, etc.
'measure_column', ['p.DAYS_ACTIVE'], -- Columns you want to perform aggregate function on
'where_clause', 'p.HEM=c.HEM' -- A boolean filter
-- $$ is used to pass string literal
)
);
データセットフィルタリングの"where_clause"またはディメンションもしくはmeasure_columns のいずれかで参照される各列について、プロバイダーテーブルのフィールドを参照するにはp.を、コンシューマーテーブルのフィールドを参照するにはc.を使用できます。複数のプロバイダーテーブルにはp2、p3などを、複数のコンシューマーテーブルにはc2、c3などを使用してください。
run_analysisの入力を決定する方法¶
分析を実行するには、run_analysis関数にいくつかのパラメータを渡す必要があります。このセクションでは、どのようなパラメータを渡すかを決定する方法を説明します。
テンプレート名
まず、以下のプロシージャを呼び出すことで、サポートされている分析テンプレートを確認できます。
call samooha_by_snowflake_local_db.consumer.view_added_templates($cleanroom_name);
テンプレートを使って分析を実行する前に、どのような引数を指定し、どのような型が期待されるかを知っておく必要があります。カスタムテンプレートについては、以下のように実行できます。
注釈
システム定義のプリセットテンプレートはすべて暗号化されており、デフォルトでは表示できないことに注意してください。ただし、追加したカスタムテンプレートはすべて表示されます。
call samooha_by_snowflake_local_db.consumer.view_template_definition($cleanroom_name, 'prod_overlap_analysis');
これには、異なるSQL Jinjaのパラメータが大量に含まれることもあります。以下の機能は、SQL Jinjaテンプレートを解析し、run_analysisで指定する必要がある引数をリストに抽出します。
注釈
システム定義の事前設定テンプレートはすべて暗号化されているため、この関数はこれらのテンプレートの引数を取得しないことに注意してください。ただし、カスタムテンプレートのパラメータを取得することはできます。
call samooha_by_snowflake_local_db.consumer.get_arguments_from_template($cleanroom_name, 'prod_overlap_analysis');
データセット名
プロバイダーによってクリーンルームに追加されたデータセット名を表示したい場合は、次の手順を呼び出します。クリーンルームのセキュリティ特性上、プロバイダーがクリーンルームに追加したデータセットは表示できません。
call samooha_by_snowflake_local_db.consumer.view_provider_datasets($cleanroom_name);
また、クリーンルームにリンクしたテーブルは、以下の呼び出しで確認することができます。
call samooha_by_snowflake_local_db.consumer.view_consumer_datasets($cleanroom_name);
列のディメンションと測定。
分析を実行する際、特定の列でフィルタリング、グループ化、集計を行いたい場合があります。プロバイダーによってクリーンルームに追加された列ポリシーを表示したい場合は、次の手順を呼び出します。
call samooha_by_snowflake_local_db.consumer.view_provider_column_policy($cleanroom_name);
イプシロンとプライバシー予算
もし最後の実行手順の結果としてエラーが出るのであれば、選択した高いイプシロンに予算が残っていなかった可能性があります。残りのプライバシー予算は以下のプロシージャで確認できます。
call samooha_by_snowflake_local_db.consumer.view_remaining_privacy_budget($cleanroom_name);
指定した epsilon パラメータは、クリーンルーム内で動作する差動プライバシーメカニズムへの入力です。差分プライバシーの仕組みについては、[差分プライバシー](../differential-privacy)のセクションをご参照ください。エプシロンの値が大きいほど、有限のプライバシーバジェット(毎日リセットされる)をより多く消費することになりますが、集約されたデータに加えられるノイズが少なくなるため、結果の精度は高くなります。
よくあるエラー
実行分析の結果、 Not approved: unauthorized columns used というエラーが表示される場合は、プロバイダーが設定した結合ポリシーと列ポリシーを再度表示するとよいでしょう。
call samooha_by_snowflake_local_db.consumer.view_provider_join_policy($cleanroom_name);
call samooha_by_snowflake_local_db.consumer.view_provider_column_policy($cleanroom_name);
また、プライバシーの予算を使い果たしたため、これ以上クエリを実行できなくなる可能性もあります。残りのプライバシー予算は以下のコマンドで表示できます。毎日リセットされますが、クリーンルームのプロバイダーが希望すればリセットすることもできます。
call samooha_by_snowflake_local_db.consumer.view_remaining_privacy_budget($cleanroom_name);
差分プライバシーがクリーンルームで有効になっているかどうかは、次のAPIで確認できます。
call samooha_by_snowflake_local_db.consumer.is_dp_enabled($cleanroom_name);