Snowflakeでの合成データの使用

このプレビューでは、合成データを生成するための新しいストアドプロシージャ GENERATE_SYNTHETIC_DATA を紹介します。

概要

Snowflakeは、ソーステーブルから 合成データ を生成し、人工データによりソーステーブルと同じ列数のテーブルを生成することができます。合成データを使用して、機密データ、極秘データ、その他の制限により他者と共有できないデータを共有したり、テストしたりすることができます。合成データセットは、列の名前、数、データ型など、ソースデータセットと同じ特性を持ちますが、行数は同じか少なくなっています。合成データを使用して、Snowflakeのワークロードをテストおよび検証することができます。特に、元のデータが機密データであり、権限のないユーザーがアクセスできないようにする必要がある場合に有効です。

利点

統計的整合性:

合成データセットは元のデータセットの統計的特性を表しており、データエンジニアが実際のデータセットの統計的特性を理解するのに役立ちます。これにより、データエンジニアは実際のデータセットに基づいたソリューションをテストし、検証することができます。

本番環境の検証:

本番のデータセットと類似の合成データセットにより、プロダクションエンジニアは本番環境をテストし、検証することができます。その結果、より堅牢な本番環境が実現します。

合成データアルゴリズムについて

Snowflakeはアルゴリズムを使用して、元のデータセットに類似した合成データを生成します。アルゴリズムは元のデータセットを使用して、元のデータセットと同じ統計的特性を持つ合成データを生成します。このアルゴリズムでは、連辞を活用して列内および列間のデータ分布を把握します。この分布がキャプチャされた合成データは統計的には元データに似ていますが、元のデータのどの行にも直接参照やリンクはありません。

Snowflakeはソース列を以下のタイプのいずれかに分類しますが、これにより合成データの生成方法に影響が及びます。

  • 結合キー 任意のデータ型が可能。結合キー列はユーザーが明示的に宣言します。1回の実行で、すべてのテーブルのすべての結合キーについて、ソースデータの同じ値に対して一貫性のある合成値が出力データに生成されます。これにより、結合クエリを実行し、ソースデータに対して同じクエリを実行した場合と同様の結果を得ることができます。

  • 統計データ: 数値、ブール値、日付、時刻、タイムスタンプのデータ型。同じ型の人工値が生成され、出力データにも同様の統計的分布が見られます。

  • カテゴリ文字列 文字列の列で 少ない 一意の値* がある。実際の値は、ソースデータと同様の統計分布を持つ生成データに使用されます。

  • 非カテゴリ文字列 文字列で列で 多くの 一意の値* がある。出力で再編集されます。

* 少ない一意の値 は、一意な値の数が行数の半分以下であることを意味します。 多くの一意の値 は、一意な値の数が行数の半分以上であることを意味します。

合成データの作成

SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA ストアドプロシージャを呼び出して、1つ以上のテーブルから合成データを生成します。Snowflakeは、ストアドプロシージャを呼び出すロールに所有権が付与されたテーブルを自動的に作成します。出力テーブルの列数は入力テーブルと同じで、列名とデータ型も同じです。プライバシーフィルターが有効になっている、または入力テーブルにNULL値があると、出力テーブルの行数が少なくなりますが、それらの場合を除き出力は通常同じ行数になります。

合成データに対する結合クエリの実行

合成データに対して結合クエリを実行する場合は、結合する列をすべて 結合キー として指定します。合成ジェネレーターは、結合キーとしてマークされたすべての列で、同じソース値から同じ合成値を生成します。つまり、すべての結合キー列で、ソース値「Europe」は生成されたテーブルで同じ合成値になります。

合成データに対して複数テーブルの結合クエリを実行する場合は、結合キーとして使用する列を指定して、クエリで使用する予定のすべてのテーブルで GENERATE_SYNTHETIC_DATA を実行します。結合キーとして指定された列は、すべてのテーブルで同じソース値に対する一貫した合成値を持つことになり、合成データと元のデータでこれらのクエリが同様の動作をするようになります。

結合キーは1回の実行で一貫した合成値を生成します。プロシージャを2回目に実行すると、同じリクエストを再実行しても、結合キーに同じキー値は生成されません。

合成データのフィルタリング

GENERATE_SYNTHETIC_DATA ストアドプロシージャを呼び出すときに、 'privacy_filter': True 構成オプションを任意で設定し、出力テーブルにプライバシーフィルターを適用することができます。プライバシーフィルターは、行が入力データセットと類似しすぎている場合、出力テーブルから行を削除します。プライバシーしきい値は、最近傍距離比(NNDR)と最も近い記録までの距離(DCR)の値を使用して、出力テーブルから行を削除すべきかどうかを決定します。

要件

入力テーブルの要件

テーブルとビューの両方がソースデータとしてサポートされています。1つのプロシージャ呼び出しにつき、最大5つの入力テーブルを指定できます。

合成データを生成するには、 各々の 入力テーブルまたはビューが、以下の要件を満たす必要があります。

  • 最低20の異なる行

  • 最大100列

  • 最大230万列

  • 以下のデータ型がサポートされています。サポートされていないデータ型の列は、列内のすべての値に対して 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利用規約 に同意する必要があります。

推奨事項

例: 複数のテーブルからの合成データ

この例では、 Snowflakeサンプルデータベース SNOWFLAKE_SAMPLE_DATA を使用します。アカウントに表示されていない場合は、以下のコマンドでコピーできます。

USE ROLE ACCOUNTADMIN;
CREATE or REPLACE DATABASE SNOWFLAKE_SAMPLE_DATA from share SFC_SAMPLES.SAMPLE_DATA;
Copy

複数の入力テーブルから合成データを生成する場合は、以下の手順に従います。

  1. 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.
    
    Copy
  2. 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
    );
    
    Copy
  3. 入力テーブルをクエリしてデータを表示し、各テーブルに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;
    
    Copy
  4. 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
      });
    
    Copy
  5. 出力テーブルをクエリして合成データを表示します。

    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;
    
    Copy
  6. すべてのオブジェクトのクリーンアップ

    USE ROLE ACCOUNTADMIN;
    DROP DATABASE syndata_db;
    DROP ROLE data_engineer;
    DROP WAREHOUSE syndata_wh;
    
    Copy