◾️はじめに
https://dk521123.hatenablog.com/entry/2025/12/19/233012
の続き。 今回は、Snowflakeで合成データ作成可能な GENERATE_SYNTHETIC_DATAについて、扱う
目次
【1】Snowflakeでの合成データ作成 1)メリット 2)デメリット 【2】GENERATE_SYNTHETIC_DATA 1)引数 2)使用上の注意 【3】サンプル 例1:Hello world 例2:複数のテーブルからの合成データ 例3:一貫性キーを使用して、複数の実行間で一貫した値を生成
【1】Snowflakeでの合成データ作成
* 以下の公式ドキュメントを参照
https://docs.snowflake.com/en/user-guide/synthetic-data
1)メリット
* 外部キーのようなデータを扱う場合でも一貫性を保って合成データを作成できる
2)デメリット
* 無効な UTF-8文字を扱うことができない => Snowflake 上でサポートされている文字コードは UTF-8
エラー「Invalid UTF8 detected while decoding 'XXX'」表示
https://dk521123.hatenablog.com/entry/2025/06/07/230713
【2】GENERATE_SYNTHETIC_DATA
* 入力テーブルのデータに基づいて合成データを生成するストアド
https://docs.snowflake.com/ja/sql-reference/stored-procedures/generate_synthetic_data
1)引数
* Snowflakeとしては、結構珍しくJSON
https://docs.snowflake.com/ja/sql-reference/stored-procedures/generate_synthetic_data#arguments
{ 'datasets': [ { 'input_table': '<input_table_name>', 'output_table' : '<output_table_name>', 'columns': { '<column_name>': { <property_name>: <property_value> } , ... } } , ... ], 'similarity_filter': <boolean>, 'replace_output_tables': <boolean>, 'consistency_secret': <session_scoped_reference_string> }
datasets
| Parameters | Explanations |
|---|---|
| input_table | 合成データを生成するための入力テーブル |
| output_table | 合成データを格納する出力テーブル |
| columns (Option) | 特定の列に対する追加プロパティ |
'datasets':[ { 'input_table': 'd.s.orders', 'output_table': 'd.s.orders_synth', 'columns': {'cust_id': {'join_key': True, 'replace': 'uuid'}, ...} },
similarity_filter (Option)
* 合成データの作成時に類似度フィルターを使用するかどうかを指定 => TRUE に設定すると、入力テーブルの行と類似しすぎている行を削除 * Default: FALSE
replace_output_tables (Option)
* 合成データの作成時に出力合成データテーブルを上書きするかどうかを指定 * Default: FALSE
consistency_secret (Option)
* 対称キー SECRET のセッションスコープ参照 STRING * Default: FALSE
2)使用上の注意
[1] Enterprise Edition(またはそれ以上)が必要
https://docs.snowflake.com/ja/sql-reference/stored-procedures/generate_synthetic_data
より抜粋 ~~~~~~~~ * この機能には、Enterprise Edition(またはそれ以上)が必要です。 ~~~~~~~~
[2] 項目が多い(100超?)場合、エラーになる
210012 (P0000): Number of columns for input table XXXX exceeds the allowed limit
[3] 機密事項は「**redacted**」になる
* 機密事項に関わる項目(e.g. ID, Email)は、特に何も設定しないと、 自動的に「**redacted**」で出力される => 回避するには、categoricalで指定する必要あり cf. redacted(リダクテッド) = 文書の一部が編集・削除された状態を指す
https://docs.snowflake.com/ja/sql-reference/stored-procedures/generate_synthetic_data#arguments
-- categorical: TRUE に設定すると、出力でデータを非機密データとして使用できる CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({ 'datasets':[ { 'input_table': 'CLINICAL_DB.PUBLIC.BASE_TABLE', 'output_table': 'my_db.public.test_syndata', 'columns': { 'patient_id': {'categorical': TRUE}} } ],
[4] その他
* 公式ドキュメントの以下を参照
https://docs.snowflake.com/ja/sql-reference/stored-procedures/generate_synthetic_data
より抜粋(一部編集) ~~~~ このプロシージャの実行については、 要件 をご参照ください。 いずれかの要件が満たされない場合、リクエストはデータの生成を開始する前に失敗します。 合成データを生成するには、 各々の 入力テーブルまたはビューが、 以下の要件を満たす必要があります。 * 最低20の異なる行 * 最大100列 * 最大14M行 .... ~~~~
https://docs.snowflake.com/ja/sql-reference/stored-procedures/generate_synthetic_data#usage-notes
より抜粋 ~~~~~~~~ * JSON キー値は小文字にする必要があります。 * この機能を有効にするには、Snowflakeアカウントで Anaconda利用規約 に同意する必要があります << めんどい、、、 ~~~~~~~~ など、、、
【3】サンプル
例1:Hello world
https://docs.snowflake.com/ja/sql-reference/stored-procedures/generate_synthetic_data#examples
CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
'datasets':[
{
'input_table': 'syndata_db.sch.faker_source_t',
'output_table': 'syndata_db.sch.faker_synthetic_t'
}
]
});
例2:複数のテーブルからの合成データ
https://docs.snowflake.com/ja/user-guide/synthetic-data#example-synthetic-data-from-multiple-tables
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
});
例3:一貫性キーを使用して、複数の実行間で一貫した値を生成
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.test_syndata', 'columns': { 'patient_id': {'join_key': TRUE, 'replace': 'uuid'}} } ], 'consistency_secret': SYSTEM$REFERENCE('SECRET', 'MY_CONSISTENCY_SECRET', 'SESSION', 'READ')::STRING, 'replace_output_tables': TRUE });
関連記事
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world ~
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ テストデータ作成 / generator ~
https://dk521123.hatenablog.com/entry/2022/06/20/095659
エラー「Invalid UTF8 detected while decoding 'XXX'」表示
https://dk521123.hatenablog.com/entry/2025/06/07/230713