Synthetische Daten in Snowflake verwenden

Mit dieser Release wird eine neue gespeicherte Prozedur, GENERATE_SYNTHETIC_DATA, eingeführt, um synthetische Daten zu erzeugen.

Überblick

Snowflake kann synthetische Daten aus einer Quelltabelle generieren, wobei eine Tabelle mit der gleichen Anzahl von Spalten wie die Quelltabelle, aber mit statistisch ähnlichen künstlichen Daten entsteht. Sie können synthetische Daten verwenden, um Daten auszutauschen oder zu testen, die zu sensibel, vertraulich oder anderweitig eingeschränkt sind, um sie mit anderen zu teilen. Der synthetische Datensatz hat dieselben Merkmale wie der Quelldatensatz, z. B. Name, Anzahl und Datentyp der Spalten und dieselbe oder eine geringere Anzahl von Zeilen. Sie können synthetische Daten verwenden, um Workloads in Snowflake zu testen und zu validieren, insbesondere wenn die Originaldaten sensibel sind und für unbefugte Benutzer nicht zugänglich sein sollten. Synthetische Daten erscheinen im Datenherkunftsdiagramm.

Vorteile

Statistische Konsistenz:

Ein synthetischer Datensatz stellt die statistischen Eigenschaften des Originaldatensatzes dar, was Data Engineers hilft, die statistischen Eigenschaften des realen Datensatzes zu verstehen. Anschließend kann der Data Engineer Lösungen testen und validieren, die auf dem realen Datensatz basieren.

Validierung der Produktion:

Ein synthetischer Datensatz, der einem Produktionsdatensatz ähnelt, ermöglicht es Produktionstechnikern, ihre Produktionsumgebung zu testen und zu validieren. Das Ergebnis ist eine stabilere Produktionsumgebung.

Über den Algorithmus für synthetische Daten

Snowflake verwendet einen Algorithmus, um synthetische Daten zu erzeugen, die dem Originaldatensatz ähnlich sind. Der Algorithmus verwendet den Originaldatensatz, um synthetische Daten zu erzeugen, die dieselben statistischen Eigenschaften wie der Originaldatensatz haben. Sobald diese Verteilung erfasst ist, ähneln die synthetischen Daten statistisch gesehen den Originaldaten, haben aber keinen direkten Bezug oder eine Verbindung zu einer Zeile der Originaldaten.

Generierung synthetischer Daten

Rufen Sie GENERATE_SYNTHETIC_DATA auf, um synthetische Daten aus einer oder mehreren Tabellen zu erzeugen. Snowflake erstellt synthetische Datentabellen, deren Eigentümerschaft der Rolle gewährt ist, die die gespeicherte Prozedur aufruft. Die Ausgabetabellen haben die gleiche Anzahl von Spalten wie die Eingabetabellen, mit den gleichen Spaltennamen und Datentypen. Die Ausgabe hat in der Regel die gleiche Anzahl von Zeilen, es sei denn, Sie aktivieren den Datenschutzfilter. In diesem Fall könnten die Ausgabetabellen weniger Zeilen haben.

Generierte Datenwerte

Snowflake erzeugt synthetische Daten für Nicht-Verknüpfungsschlüsselspalten entsprechend dem Quelldatentyp:

  • Statistische Daten: Daten vom Typ Zahl, boolesch, Datum, Uhrzeit oder Zeitstempel. Die generierten Daten sind vom gleichen Typ und haben ähnliche Werte wie die Quelldaten.

  • Kategorische Zeichenfolge: Eine Zeichenfolge-Spalte mit wenigen eindeutigen Werten. Generierte Daten verwenden tatsächliche Werte aus den Quelldaten.

  • Nicht-kategorische Zeichenfolge: Eine Zeichenfolge-Spalte mit vielen eindeutigen Werten. In der Ausgabe redigiert, es sei denn, Sie geben ein Ausgabeformat mit der Option replace in GENERATE_SYNTHETIC_DATA an.

Sie können eine Nicht-Verknüpfungsschlüsselzeichenfolgespalte explizit als kategorisch oder nicht kategorisch kennzeichnen, indem Sie einen categorical-Wert an GENERATE_SYNTHETIC_DATA übergeben. Verknüpfungsschlüsselspalten müssen nicht-kategorische Zeichenfolgen oder statistisch sein.

Die generierten Daten in jeder Tabelle behalten die ungefähren Verteilungen und Korrelationen in der Originaltabelle bei.

Spalten, die als Verknüpfungsschlüssel bezeichnet werden, können von jedem Datentyp sein und führen zu synthetischen Daten desselben Typs und konsistenten, aber künstlichen Werten.

Wenige eindeutige Werte bedeutet, dass die Anzahl der eindeutigen Werte weniger als die Hälfte der Zeilenzahl beträgt. Viele eindeutige Werte bedeutet, dass die Anzahl der eindeutigen Werte mehr als die Hälfte der Zeilenzahl beträgt.

Aufrechterhaltung der Konsistenz von Verknüpfungsschlüsseln in synthetischen Daten

Wenn Sie planen, Verknüpfungsabfragen auf Ihren synthetischen Daten durchzuführen, definieren Sie jede Spalte, die Sie verknüpfen wollen, als Verknüpfungsschlüssel. Sie können jede numerische, boolesche oder nicht-kategorische Spalte als Verknüpfungsschlüssel festlegen, indem Sie den Wert join_key in GENERATE_SYNTHETIC_DATA zuweisen. Ein konsistenter synthetischer Wert wird in den Ausgabedaten für denselben Wert in den Quelldaten für alle Verknüpfungsschlüssel in allen Tabellen während einer einzigen Ausführung erzeugt. Auf diese Weise können Sie Verknüpfungsabfragen ausführen und erhalten ähnliche Ergebnisse wie bei der gleichen Abfrage der Quelldaten.

Um die Verknüpfungskonsistenz zwischen Tabellen aufrechtzuerhalten, stellen Sie sicher, dass die gleiche Verknüpfungsschlüsselspalte in jeder Tabelle die gleichen Argumente hat. Das heißt, wenn Sie erwarten, dass cust_id tabellenübergreifend verknüpft werden kann, geben Sie in der columns-Beschreibung in jedem Datensatzobjekt den gleichen Satz an Argumenten und Werten an:

'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'}, ...}

  }
]
Copy

Wenn Sie ein symmetrisches Zeichenfolge-Geheimnis zu consistency_secret in GENERATE_SYNTHETIC_DATA bereitstellen, sind die Werte des Verknüpfungsschlüssels über Tabellen und mehrere Durchläufe hinweg konsistent. Wenn Sie kein Geheimnis angeben, sind die Werte des Verknüpfungsschlüssels in allen Tabellen eines einzelnen Laufs konsistent, aber nicht über mehrere Läufe hinweg. Konsistenz bei mehreren Durchläufen wird nur für Zeichenfolge-Spalten unterstützt.

Beispiel: Konsistenz der Verknüpfungsschlüssel in einem Durchgang

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
});
Copy

Beispiel: Konsistenz von Verknüpfungsschlüsseln mit mehreren Durchläufen

-- 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
});
Copy

Verbesserung der Privatsphäre

Wenn Sie die gespeicherte Prozedur GENERATE_SYNTHETIC_DATA aufrufen, können Sie optional die Konfigurationsoption 'similarity_filter': True setzen, um einen Datenschutzfilter auf die Ausgabetabelle anzuwenden. Der Datenschutzfilter entfernt Zeilen aus der Ausgabetabelle, wenn die Zeilen dem Eingabedatensatz zu ähnlich sind. Der Schwellenwert für den Datenschutz verwendet die Werte für den Abstand zum nächsten Nachbarn (NNDR) und den Abstand zum nächsten Datensatz (DCR), um zu bestimmen, ob eine Zeile aus der Ausgabetabelle entfernt werden sollte.

NULL-Werte in Nicht-Zeichenfolge-Spalten führen dazu, dass der Ähnlichkeitsfilter fehlschlägt und keine synthetischen Daten erzeugt.

Anforderungen

Anforderungen für die Eingabetabelle

Als Quelldaten werden sowohl Tabellen als auch Ansichten unterstützt. Sie können bis zu fünf Eingabetabellen pro Prozeduraufruf angeben.

Um synthetische Daten zu erzeugen, muss jede Eingabetabelle oder Ansicht die folgenden Anforderungen erfüllen:

  • Mindestens 20 eindeutige Zeilen

  • Maximal 100 Spalten

  • Maximal 14 M Zeilen

  • Die folgenden Eingabetabellentypen werden unterstützt:

    • Reguläre, temporäre, dynamische und transiente Tabellen

    • Reguläre, materialisierte, sichere und sichere materialisierte Ansichten

  • Die folgenden Eingabetabellentypen werden nicht unterstützt:

    • Externe, Apache Iceberg™-, und Hybridtabellen

    • Streams

  • Die folgenden Spaltentypen werden unterstützt. Spalten eines nicht unterstützten Datentyps geben NULL für alle Werte in der Spalte zurück.

    • Alle numerischen Typen (NUMBER, DECIMAL, FLOAT, INTEGER und so weiter)

    • BOOLEAN

    • Alle Datums- und Zeittypen (DATE, DATETIME, TIME, TIMESTAMP und so weiter), außer TIMESTAMP_TZ

    • STRING, VARCHAR, CHAR, CHARACTER, TEXT

      Wenn mehr als die Hälfte der Werte in einer STRING-Spalte eindeutige Werte sind, ersetzt Snowflake den Wert in der Ausgabetabelle aus Datenschutzgründen durch einen redigierten Wert.

Anforderungen an die Zugriffssteuerung

Um synthetische Daten zu erzeugen, müssen Sie eine Rolle mit jeder der folgenden Berechtigungen verwenden:

  • USAGE für das Warehouse, das Sie für Abfragen verwenden möchten.

  • SELECT für die Eingabetabelle, aus der Sie synthetische Daten erzeugen möchten.

  • USAGE-Berechtigung für die Datenbank und das Schema, die die Eingabetabelle enthalten, sowie für die die Ausgabetabelle enthält.

  • CREATE TABLE für das Schema, das die Ausgabetabelle enthält.

  • OWNERSHIP für die Ausgabetabellen. Am einfachsten geht das, indem Sie OWNERSHIP für das Schema freigeben, in dem die Ausgabetabelle erstellt wird. (Wenn jedoch jemand ein FUTURE GRANT auf dieses Schema angewandt hat, werden die Eigentümerschaft an den Tabellen stillschweigend überschrieben, d. h. GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA db.my_schema TO ROLE some_role erteilt die OWNERSHIP für alle neuen Tabellen, die im Schema my_schema erstellt werden, automatisch an some_role)

Alle Benutzer können auf die gespeicherte Prozedur SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA zugreifen. Der Zugriff erfolgt über die Datenbankrolle SNOWFLAKE.CORE_VIEWER, die der Rolle PUBLIC zugewiesen ist.

Andere Anforderungen

Sie müssen die Anaconda-Bedingungen in Ihrem Snowflake-Konto akzeptieren, um dieses Feature zu aktivieren.

Empfehlungen

  • Verwenden Sie ein mittleres Snowpark-optimiertes Warehouse.

  • Während GENERATE_SYNTHETIC_DATA ausgeführt wird, führen Sie keine anderen Abfragen in diesem Warehouse aus.

Beispiel: Synthetische Daten aus mehreren Tabellen

Dieses Beispiel verwendet die Datenbank Snowflake Sample Data SNOWFLAKE_SAMPLE_DATA. Wenn Sie sie nicht in Ihrem Konto sehen, können Sie sie mit den folgenden Befehlen kopieren:

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

Folgen Sie diesen Schritten, um synthetische Daten aus mehreren Eingabetabellen zu erzeugen:

  1. Erstellen und konfigurieren Sie die Zugriffssteuerung für die Rolle data_engineer, damit diese alle erforderlichen Objekte erstellen kann:

    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. Erstellen Sie zwei Ansichten aus der Snowflake-Beispieldatenbank:

    - 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. Fragen Sie die Eingabetabellen ab, um die Daten anzuzeigen, und bestätigen Sie, dass jede Tabelle 5.000 Zeilen hat:

    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. Rufen Sie die gespeicherte Prozedur GENERATE_SYNTHETIC_DATA auf, um die synthetischen Daten in zwei Ausgabetabellen zu erzeugen. Legen Sie Verknüpfungsschlüssel fest, da Sie später auf diesen Schlüsseln Verknüpfungen durchführen werden.

    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. Fragen Sie die Ausgabetabelle ab, um die synthetischen Daten anzuzeigen:

    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. Bereinigen Sie alle Objekte

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