Como usar dados sintéticos no Snowflake

Este lançamento apresenta um novo procedimento armazenado, GENERATE_SYNTHETIC_DATA, para gerar dados sintéticos.

Visão geral

O Snowflake pode gerar dados sintéticos a partir de uma tabela de origem, produzindo uma tabela com o mesmo número de colunas que a tabela de origem, mas com dados artificiais estatisticamente semelhantes. É possível usar dados sintéticos para compartilhar ou testar dados que são muito sensíveis, confidenciais ou restritos para serem compartilhados com outras pessoas. O conjunto de dados sintéticos tem as mesmas características do conjunto de dados de origem, como nome, número e tipo de dados de colunas, e o mesmo número de linhas ou um número menor. É possível usar dados sintéticos para testar e validar cargas de trabalho no Snowflake, especialmente quando os dados originais são confidenciais e não devem ser acessíveis a usuários não autorizados. Os dados sintéticos aparecem no gráfico de linhagem de dados.

Benefícios

Consistência estatística:

Um conjunto de dados sintético representa as propriedades estatísticas do conjunto de dados original, o que ajuda os engenheiros de dados a entender as propriedades estatísticas do conjunto de dados real. Posteriormente, o engenheiro de dados pode testar e validar soluções baseadas no conjunto de dados reais.

Validação da produção:

Um conjunto de dados sintéticos semelhante a um conjunto de dados de produção permite que os engenheiros de produção testem e validem seu ambiente de produção. O resultado é um ambiente de produção mais robusto.

Sobre o algoritmo de dados sintéticos

O Snowflake usa um algoritmo para gerar dados sintéticos que são semelhantes ao conjunto de dados original. O algoritmo usa o conjunto de dados original para gerar dados sintéticos que têm as mesmas propriedades estatísticas do conjunto de dados original. Depois que essa distribuição é capturada, os dados sintéticos se assemelham estatisticamente aos dados originais, mas não têm uma referência direta ou um link para qualquer linha dos dados originais.

Geração de dados sintéticos

Chame GENERATE_SYNTHETIC_DATA para gerar dados sintéticos de uma ou mais tabelas. O Snowflake cria tabelas de dados sintéticos com propriedade concedida à função que chama o procedimento armazenado. As tabelas de saída têm o mesmo número de colunas que as tabelas de entrada, com os mesmos nomes de colunas e tipos de dados. A saída geralmente tem o mesmo número de linhas, a menos que você ative o filtro de privacidade, caso em que as tabelas de saída podem ter menos linhas.

Valores de dados gerados

O Snowflake gera dados sintéticos para colunas sem chave de junção de acordo com o tipo de dados de origem:

  • Dados estatísticos: dados do tipo número, booliano, data, hora ou carimbo de data/hora. Os dados gerados são do mesmo tipo, com valores semelhantes aos dos dados de origem.

  • Cadeia de caracteres categórica: uma coluna de cadeia de caracteres com poucos valores exclusivos. Os dados gerados usam valores reais dos dados de origem.

  • Cadeia não categórica: uma coluna de cadeia de caracteres com muitos valores exclusivos. Redigido na saída, a menos que você especifique um formato de saída com a opção replace em GENERATE_SYNTHETIC_DATA.

Você pode designar explicitamente uma coluna de cadeia de caracteres sem chave conjunta como categórica ou não categórica, fornecendo um valor categorical para GENERATE_SYNTHETIC_DATA. As colunas de chave de junção devem ser cadeias de caracteres não categóricas ou estatísticas.

Os dados gerados em cada tabela mantêm as distribuições e correlações aproximadas presentes na tabela original.

As colunas designadas como chaves de junção podem ser de qualquer tipo de dados e resultarão em dados sintéticos do mesmo tipo e valores consistentes, mas artificiais.

Poucos valores exclusivos significa que o número de valores exclusivos é menor que a metade da contagem de linhas. Muitos valores exclusivos significa que o número de valores exclusivos é maior que a metade da contagem de linhas.

Manutenção da consistência da chave de junção em dados sintéticos

Se você planeja executar consultas de junção nos dados sintéticos, designe cada coluna que será unida como uma chave de junção. Você pode designar qualquer coluna numérica, booliana ou não categórica como uma chave de junção, atribuindo o valor join_key em GENERATE_SYNTHETIC_DATA. Um valor sintético consistente é gerado nos dados de saída para o mesmo valor nos dados de origem para todas as chaves de junção em todas as tabelas durante uma única execução. Isso permite que você execute consultas de junção e obtenha resultados semelhantes aos que obteria ao executar a mesma consulta nos dados de origem.

Para manter a consistência da junção entre as tabelas, certifique-se de que a mesma coluna de chave de junção em cada tabela tenha os mesmos argumentos. Ou seja, se você espera que cust_id possa ser unido em tabelas, forneça o mesmo conjunto de argumentos e valores na descrição de columns em cada objeto de conjunto de dados:

'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

Se você fornecer um segredo de cadeia de caracteres simétrica para consistency_secret em GENERATE_SYNTHETIC_DATA, os valores da chave de junção serão consistentes entre tabelas e várias execuções. Se você não especificar um segredo, os valores da chave de junção serão consistentes em todas as tabelas em uma única execução, mas não em várias execuções. A consistência de várias execuções é compatível apenas com colunas de cadeia de caracteres.

Exemplo: consistência de chave de junção de execução única

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

Exemplo: consistência de chave de junção de várias execuções

-- 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

Aumento de privacidade

Ao chamar o procedimento armazenado GENERATE_SYNTHETIC_DATA, é possível definir a opção de configuração 'similarity_filter': True para aplicar um filtro de privacidade à tabela de saída. O filtro de privacidade remove as linhas da tabela de saída se as linhas forem muito semelhantes ao conjunto de dados de entrada. O limite de privacidade usa a taxa de distância do vizinho mais próximo (NNDR) e a distância para o registro mais próximo (DCR) para determinar se uma linha deve ser removida da tabela de saída.

Valores NULL em colunas que não sejam cadeias de caracteres farão com que o filtro de similaridade falhe e não gerará dados sintéticos.

Requisitos

Requisitos da tabela de entrada

Tanto as tabelas quanto as exibições são aceitas como dados de origem. É possível especificar até cinco tabelas de entrada por chamada de procedimento.

Para gerar dados sintéticos, cada tabela ou exibição de entrada deve atender aos seguintes requisitos:

  • Mínimo de 20 linhas distintas

  • Máximo de 100 colunas

  • Máximo de 14 milhões de linhas

  • Os seguintes tipos de tabela de entrada são compatíveis com:

    • Tabelas regulares, temporárias, dinâmicas e transitórias

    • Exibições regulares, materializadas, seguras e materializadas seguras

  • Os seguintes tipos de tabela de entrada não são compatíveis com:

    • Tabelas externas, Apache Iceberg™ e híbridas

    • Fluxos

  • Os seguintes tipos de coluna são compatíveis. As colunas de um tipo de dados não compatível retornam NULL para todos os valores da coluna.

    • Todos os tipos numéricos (NUMBER, DECIMAL, FLOAT, INTEGER e assim por diante)

    • BOOLEAN

    • Todos os tipos de data e hora (DATE, DATETIME, TIME, TIMESTAMP e assim por diante) exceto TIMESTAMP_TZ

    • STRING, VARCHAR, CHAR, CHARACTER, TEXT

      Se mais da metade dos valores em uma coluna STRING for de valores exclusivos, o Snowflake substitui o valor por um valor censurado na tabela de saída devido a preocupações com a privacidade.

Requisitos de controle de acesso

Para gerar dados sintéticos, é necessário usar uma função com cada uma das seguintes concessões:

  • USAGE no warehouse que você deseja usar para consultas.

  • SELECT na tabela de entrada a partir da qual você deseja gerar dados sintéticos.

  • USAGE no banco de dados e no esquema que contêm a tabela de entrada, bem como no banco de dados que contém a tabela de saída.

  • CREATE TABLE no esquema com a tabela de saída.

  • OWNERSHIP nas tabelas de saída. A maneira mais simples de fazer isso é conceder OWNERSHIP ao esquema em que a tabela de saída é gerada. (No entanto, se alguém tiver aplicado um FUTURE GRANT nesse esquema, a propriedade da tabela será silenciosamente substituída, ou seja, o GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA db.my_schema TO ROLE some_role concederá automaticamente OWNERSHIP a some_role em todas as novas tabelas criadas no esquema my_schema)

Todos os usuários podem acessar o procedimento armazenado SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA. O acesso é disponibilizado usando a função de banco de dados SNOWFLAKE.CORE_VIEWER, que é concedida à função PUBLIC.

Outros requisitos

É necessário aceitar os termos e condições do Anaconda em sua conta Snowflake para ativar esse recurso.

Recomendações

Exemplo: dados sintéticos de várias tabelas

Este exemplo usa o banco de dados Snowflake Sample Data SNOWFLAKE_SAMPLE_DATA. Se não o vir em sua conta, é possível copiá-lo com os seguintes comandos:

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

Siga estas etapas para gerar dados sintéticos a partir de várias tabelas de entrada:

  1. Crie e configure o controle de acesso para a função data_engineer para permitir a criação de todos os objetos necessários:

    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. Crie duas exibições a partir do banco de dados Snowflake Sample Data:

    - 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. Consulte as tabelas de entrada para visualizar os dados e confirmar que cada tabela tem 5.000 linhas:

    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. Chame o procedimento armazenado GENERATE_SYNTHETIC_DATA para gerar os dados sintéticos em duas tabelas de saída. Designe chaves de junção, pois você fará a junção nessas chaves mais tarde.

    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. Consulta da tabela de saída para visualizar os dados sintéticos:

    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. Como limpar todos os objetos

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