Como usar dados sintéticos no Snowflake¶
Esta prévia 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. É 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.
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. O algoritmo aproveita as cópulas para capturar a distribuição dos dados dentro e entre as colunas. 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.
O Snowflake categoriza as colunas de origem como um dos seguintes tipos, o que afeta a forma como os dados sintéticos são gerados:
Chave de junção: pode ser qualquer tipo de dados. As colunas de chave de junção são declaradas explicitamente pelo usuário. 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.
Dados estatísticos: dados do tipo número, booliano, data, hora ou carimbo de data/hora. São gerados valores artificiais do mesmo tipo, com uma distribuição estatística semelhante nos dados de saída.
Cadeia de caracteres categórica: uma coluna de cadeia de caracteres com poucos valores exclusivos*. Os valores reais são usados nos dados gerados com uma distribuição estatística semelhante à dos dados de origem.
Cadeia de caracteres não categórica: uma coluna de cadeia de caracteres com muitos valores exclusivos*. Censurado na saída.
* Poucos valores exclusivos significam que o número de valores exclusivos é menor que a metade da contagem de linhas. Muitos valores exclusivos significam que o número de valores exclusivos é maior que a metade da contagem de linhas.
Geração de dados sintéticos¶
Chame o procedimento armazenado SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA para gerar dados sintéticos de uma ou mais tabelas. O Snowflake cria automaticamente tabelas 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 ou a tabela de entrada tenha valores nulos, caso em que as tabelas de saída podem ter menos linhas.
Execução de consultas 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. O gerador sintético produzirá o mesmo valor sintético a partir do mesmo valor de origem em todas as colunas marcadas como chaves de junção. Ou seja, em todas as colunas de chave de junção, o valor de origem «Europa» resultará no mesmo valor sintético nas tabelas geradas.
Se planeja executar consultas de junção de várias tabelas nos dados sintéticos, execute GENERATE_SYNTHETIC_DATA com todas as tabelas que planeja usar na consulta, especificando quais colunas serão usadas como chaves de junção. As colunas designadas como chaves de junção terão um valor sintético consistente para o mesmo valor de origem em todas as tabelas, o que faz com que essas consultas se comportem de forma semelhante nos dados sintéticos e nos dados originais.
As chaves de junção geram valores sintéticos consistentes em uma única execução. A execução do procedimento uma segunda vez não gerará os mesmos valores de chave para chaves de junção, mesmo quando você executar novamente uma solicitação idêntica.
Filtragem dos dados sintéticos¶
Ao chamar o procedimento armazenado GENERATE_SYNTHETIC_DATA, é possível definir a opção de configuração 'privacy_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.
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 2,3 milhões de linhas
Os seguintes tipos de dados 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 asome_role
em todas as novas tabelas criadas no esquemamy_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¶
Use um warehouse otimizado para Snowpark médio.
Enquanto
GENERATE_SYNTHETIC_DATA
estiver em execução, não execute nenhuma outra consulta nesse warehouse.
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;
Siga estas etapas para gerar dados sintéticos a partir de várias tabelas de entrada:
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.
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 );
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;
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 });
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;
Como limpar todos os objetos
USE ROLE ACCOUNTADMIN; DROP DATABASE syndata_db; DROP ROLE data_engineer; DROP WAREHOUSE syndata_wh;