【Snowflake】Snowflake ~ GENERATE_SYNTHETIC_DATA ~

◾️はじめに

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