Snowflakeでの合成データの使用¶
このリリースでは、合成データを生成するための新しいストアドプロシージャ GENERATE_SYNTHETIC_DATA が導入されました。
概要¶
Snowflakeは、ソーステーブルから 合成データ を生成し、ソーステーブルと同じ列数で、統計的に類似した人工データを持つテーブルを作成することができます。合成データを使用して、機密データ、極秘データ、その他の制限により他者と共有できないデータを共有したり、テストしたりすることができます。合成データセットは、列の名前、数、データ型など、ソースデータセットと同じ特性を持ちますが、行数は同じか少なくなっています。合成データを使用して、Snowflakeのワークロードをテストおよび検証することができます。特に、元のデータが機密データであり、権限のないユーザーがアクセスできないようにする必要がある場合です。合成データは データ系統グラフ に表示されます。
利点¶
- 統計的整合性:
合成データセットは元のデータセットの統計的特性を表しており、データエンジニアが実際のデータセットの統計的特性を理解するのに役立ちます。これにより、データエンジニアは実際のデータセットに基づいたソリューションをテストし、検証することができます。
- 本番環境の検証:
本番のデータセットと類似の合成データセットにより、プロダクションエンジニアは本番環境をテストし、検証することができます。その結果、より堅牢な本番環境が実現します。
合成データアルゴリズムについて¶
Snowflakeはアルゴリズムを使用して、元のデータセットに類似した合成データを生成します。アルゴリズムは元のデータセットを使用して、元のデータセットと同じ統計的特性を持つ合成データを生成します。この分布がキャプチャされた合成データは統計的には元データに似ていますが、元のデータのどの行にも直接参照やリンクはありません。
合成データの作成¶
GENERATE_SYNTHETIC_DATA を呼び出して、1 つ以上のテーブルから合成データを生成します。Snowflakeは、ストアドプロシージャを呼び出すロールに所有権が付与された合成データテーブルを作成します。出力テーブルの列数は入力テーブルと同じで、列名とデータ型も同じです。 プライバシーフィルター を有効にしない限り、出力は通常同じ行数になりますが、その場合、出力テーブルの行数は少なくなります。
生成されたデータ値¶
Snowflakeは、結合キー以外の列に対して、ソースデータ型に応じた合成データを生成します。
統計データ: 数値、ブール値、日付、時刻、タイムスタンプのデータ型。生成されるデータは、ソースデータと同じタイプで、同じような値です。
カテゴリ文字列: 文字列の列で 少ない 一意の値: sup:
‡
。生成されたデータは、ソースデータの実際の値を使用します。非カテゴリ文字列 文字列で列で 多くの 一意の値‡ がある。GENERATE_SYNTHETIC_DATA の
replace
オプションで出力形式を指定しない限り、出力は再編集されます。
GENERATE_SYNTHETIC_DATA に categorical
の値を提供することで、非結合キーの文字列列を明示的にカテゴリカルあるいは非カテゴリに指定することができます。結合キー列は非カテゴリ文字列または統計でなければなりません。
各表で生成されたデータは、元のテーブルに存在するおおよその分布と相関を維持します。
結合キーとして指定された列はどのようなデータ型でも構いません。同じタイプの一貫しているが、人工で値である合成データの結果になります。
‡ 少ない一意の値 は、一意な値の数が行数の半分以下であることを意味します。 多くの一意の値 は、一意な値の数が行数の半分以上であることを意味します。
合成データにおける結合キーの一貫性の維持¶
合成データに対して結合クエリを実行する場合は、結合する列をすべて 結合キー として指定します。数値列、ブール列、非カテゴリ列のどれでも、 GENERATE_SYNTHETIC_DATA に join_key
の値を代入することで、結合キーとして指定することができます。1回の実行で、すべてのテーブルのすべての結合キーについて、ソースデータの同じ値に対して一貫性のある合成値が出力データに生成されます。これにより、結合クエリを実行し、ソースデータに対して同じクエリを実行した場合と同様の結果を得ることができます。
テーブル間の結合の一貫性を保つために、各テーブルの同じ結合キー列が同じ引数を持っていることを確認してください。つまり、 cust_id
がテーブル間で結合可能であることを期待する場合は、各データセットオブジェクトの columns
記述に、同じ引数セットと値を指定してください。
'datasets':[
{
'input_table': 'd.s.orders',
'output_table': 'd.s.orders_synth',
'columns': {'cust_id': {'join_key': True, 'replace': 'uuid'}, ...}
},
{
'input_table': 'd.s.customers',
'output_table': 'd.s.customers_synth',
'columns' : {'cust_id': {'join_key': True, 'replace':'uuid'}, ...}
}
]
対称文字列シークレット を GENERATE_SYNTHETIC_DATA の consistency_secret
に提供した場合、結合キー値はテーブルや複数回の実行で一貫性が保たれます。シークレットを指定しない場合、結合キー値は1回の実行ですべてのテーブルで一貫性が保たれますが、複数回の実行では一貫性が保たれません。マルチラン一貫性は文字列列でのみサポートされています。
例: シングルランジョインキーの一貫性
CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
'datasets':[
{
'input_table': 'CLINICAL_DB.PUBLIC.PATIENTS1',
'output_table': 'MY_DB.PUBLIC.PATIENTS1',
'columns': { 'patient_id': {'join_key': TRUE}, 'age':{'join_key': TRUE}}
},
{
'input_table': 'CLINICAL_DB.PUBLIC.PATIENTS2',
'output_table': 'MY_DB.PUBLIC.PATIENTS2',
'columns': { 'patient_id': {'join_key': TRUE}, 'age':{'join_key': TRUE}}
}
],
'replace_output_tables': TRUE
});
例: 複数実行ジョインキーの一貫性
-- Generate consistent join keys across multiple runs by
-- providing a symmetric key secret.
CREATE OR REPLACE SECRET my_db.public.my_consistency_secret
TYPE=SYMMETRIC_KEY
ALGORITHM=GENERIC;
CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
'datasets':[
{
'input_table': 'CLINICAL_DB.PUBLIC.BASE_TABLE',
'output_table': 'MY_DB.PUBLIC.PATIENTS1',
'columns': { 'patient_id': {'join_key': TRUE}}
}
],
'consistency_secret': SYSTEM$REFERENCE('SECRET', 'MY_CONSISTENCY_SECRET', 'SESSION', 'READ')::STRING,
'replace_output_tables': TRUE
});
CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
'datasets':[
{
'input_table': 'CLINICAL_DB.PUBLIC.SECOND_TABLE',
'output_table': 'MY_DB.PUBLIC.PATIENTS2',
'columns': { 'patient_id': {'join_key': TRUE}}
}
],
'consistency_secret': SYSTEM$REFERENCE('SECRET', 'MY_CONSISTENCY_SECRET', 'SESSION', 'READ')::STRING,
'replace_output_tables': TRUE
});
プライバシーの強化¶
GENERATE_SYNTHETIC_DATA ストアドプロシージャを呼び出すときに、 'similarity_filter': True
構成オプションを任意で設定し、出力テーブルにプライバシーフィルターを適用することができます。プライバシーフィルターは、行が入力データセットと類似しすぎている場合、出力テーブルから行を削除します。プライバシーしきい値は、最近傍距離比(NNDR)と最も近い記録までの距離(DCR)の値を使用して、出力テーブルから行を削除すべきかどうかを決定します。
NULL 文字列以外の値を指定すると、類似度フィルターは失敗し、合成データは生成されません。
要件¶
入力テーブルの要件¶
テーブルとビューの両方がソースデータとしてサポートされています。1つのプロシージャ呼び出しにつき、最大5つの入力テーブルを指定できます。
合成データを生成するには、 各々の 入力テーブルまたはビューが、以下の要件を満たす必要があります。
最低20の異なる行
最大100列
最大14M行
以下の入力テーブルタイプは対応して います。
通常テーブル、仮テーブル、動的テーブル、一時テーブル
通常ビュー、マテリアライズドビュー、セキュアビュー、セキュアマテリアライズドビュー
以下の入力テーブルタイプはサポートされて いません。
外部テーブル、 Apache Iceberg™、ハイブリッドテーブル
ストリーム
以下の列タイプがサポートされています。サポートされていないデータ型の列は、列内のすべての値に対して NULL を返します。
すべての型の数値(NUMBER、 DECIMAL、 FLOAT、 INTEGER など)
BOOLEAN
TIMESTAMP_TZ を 除く すべての型の日付と時刻(DATE、 DATETIME、 TIME、 TIMESTAMP など)
STRING, VARCHAR, CHAR, CHARACTER, TEXT
STRING の列の値の半分以上が一意な値である場合、Snowflakeはプライバシーの観点から、出力テーブルの値を再編集された値に置き換えます。
アクセス制御の要件¶
合成データを生成するには、以下の各付与を持つロールを使用する必要があります。
クエリに使用するウェアハウスに対する USAGE。
合成データの生成元の入力テーブルに対する SELECT。
入力テーブルを含むデータベースとスキーマ、また出力テーブルを含むデータベースに対する USAGE。
出力テーブルを含むスキーマに対する CREATE TABLE。
出力テーブルに対する OWNERSHIP。最も簡単な方法は、出力テーブルが生成されるスキーマに OWNERSHIP を付与することです。(ただし、誰かがこのスキーマに FUTURE GRANT を適用した場合、テーブルの所有権は警告なしに上書きされます。つまり、スキーマ
my_schema
で作成された新しいテーブルに対して、GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA db.my_schema TO ROLE some_role
は自動的に OWNERSHIP をsome_role
に付与します。)
すべてのユーザーは、 SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA ストアドプロシージャにアクセスできます。アクセスは、 PUBLIC ロールに付与された SNOWFLAKE.CORE_VIEWER データベースロールを使用すると利用可能になります。
その他の要件¶
この機能を有効にするには、Snowflakeアカウントで Anaconda利用規約 に同意する必要があります。
推奨事項¶
Mサイズの Snowparkに最適化されたウェアハウス を使用します。
GENERATE_SYNTHETIC_DATA
の実行中は、そのウェアハウスで他のクエリを実行しないでください。
例: 複数のテーブルからの合成データ¶
この例では、 Snowflakeサンプルデータベース SNOWFLAKE_SAMPLE_DATA を使用します。アカウントに表示されていない場合は、以下のコマンドでコピーできます。
USE ROLE ACCOUNTADMIN;
CREATE or REPLACE DATABASE SNOWFLAKE_SAMPLE_DATA from share SFC_SAMPLES.SAMPLE_DATA;
複数の入力テーブルから合成データを生成する場合は、以下の手順に従います。
data_engineer
ロールのアクセス制御を作成して構成し、必要なオブジェクトをすべて作成できるようにします。USE ROLE ACCOUNTADMIN; CREATE OR REPLACE ROLE data_engineer; CREATE OR REPLACE DATABASE syndata_db; CREATE OR REPLACE WAREHOUSE syndata_wh; GRANT OWNERSHIP ON DATABASE syndata_db TO ROLE data_engineer; GRANT USAGE ON WAREHOUSE syndata_wh TO ROLE data_engineer; GRANT ROLE data_engineer TO USER jsmith; -- Or whoever you want to run this example. Or skip this line to run it yourself.
Snowflakeサンプルデータデータベースから2つのビューを作成します。
- Sign in as user with data_engineer role. Then... CREATE SCHEMA syndata_db.sch; CREATE OR REPLACE VIEW syndata_db.sch.TPC_ORDERS_5K as ( SELECT * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS LIMIT 5000 ); CREATE OR REPLACE VIEW syndata_db.sch.TPC_CUSTOMERS_5K as ( SELECT * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER LIMIT 5000 );
入力テーブルをクエリしてデータを表示し、各テーブルに5,000行あることを確認します。
USE WAREHOUSE syndata_wh; SELECT TOP 20 * FROM syndata_db.sch.TPC_ORDERS_5K; SELECT COUNT(*) FROM syndata_db.sch.TPC_ORDERS_5K; select count(distinct o_clerk), count(*) from syndata_db.sch.TPC_ORDERS_5K; SELECT TOP 20 * FROM syndata_db.sch.TPC_CUSTOMERS_5K; SELECT COUNT(*) FROM syndata_db.sch.TPC_CUSTOMERS_5K;
GENERATE_SYNTHETIC_DATA ストアドプロシージャを呼び出して、合成データを2つの出力テーブルに生成します。結合キーを指定します。後でこれらのキーで結合を行います。
CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({ 'datasets':[ { 'input_table': 'syndata_db.sch.TPC_ORDERS_5K', 'output_table': 'syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC', 'columns': {'O_CUSTKEY': {'join_key': True}} }, { 'input_table': 'syndata_db.sch.TPC_CUSTOMERS_5K', 'output_table': 'syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC', 'columns' : {'C_CUSTKEY': {'join_key': True}} } ], 'replace_output_tables':True });
出力テーブルをクエリして合成データを表示します。
SELECT TOP 20 * FROM syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC; SELECT COUNT(*) FROM syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC; SELECT TOP 20 * FROM syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC; SELECT COUNT(*) FROM syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC;
すべてのオブジェクトのクリーンアップ
USE ROLE ACCOUNTADMIN; DROP DATABASE syndata_db; DROP ROLE data_engineer; DROP WAREHOUSE syndata_wh;