Utiliser des données synthétiques dans Snowflake¶
Cette avant-première présente une nouvelle procédure stockée, GENERATE_SYNTHETIC_DATA, qui permet de générer des données synthétiques.
Vue d’ensemble¶
Snowflake peut générer des données synthétiques à partir d’une table source, produisant une table avec le même nombre de colonnes que la table source, mais avec des données artificielles. Vous pouvez utiliser des données synthétiques pour partager ou tester des données trop sensibles, confidentielles ou soumises à d’autres restrictions pour être partagées avec d’autres personnes. L’ensemble de données synthétiques présente les mêmes caractéristiques que l’ensemble de données sources, telles que le nom, le nombre et le type de données des colonnes, ainsi qu’un nombre de lignes identique ou inférieur. Vous pouvez utiliser des données synthétiques pour tester et valider les charges de travail dans Snowflake, en particulier lorsque les données d’origine sont sensibles et ne doivent pas être accessibles aux utilisateurs non autorisés.
Avantages¶
- Cohérence statistique:
Un ensemble de données synthétiques représente les propriétés statistiques de l’ensemble de données original, ce qui aide les ingénieurs en données à comprendre les propriétés statistiques de l’ensemble de données réel. Par la suite, l’ingénieur des données peut tester et valider des solutions basées sur l’ensemble des données réelles.
- Validation de la production:
Un paramètre synthétique similaire à un ensemble de données de production permet aux ingénieurs de production de tester et de valider leur environnement de production. Le résultat est un environnement de production plus robuste.
À propos de l’algorithme des données synthétiques¶
Snowflake utilise un algorithme pour générer des données synthétiques similaires à l’ensemble de données original. L’algorithme utilise l’ensemble des données originales pour générer des données synthétiques qui ont les mêmes propriétés statistiques que l’ensemble des données originales. L’algorithme s’appuie sur des copules pour capturer la distribution des données à l’intérieur des colonnes et entre elles. Une fois cette distribution saisie, les données synthétiques ressemblent statistiquement aux données d’origine, mais n’ont pas de référence ou de lien direct avec une ligne quelconque des données d’origine.
Snowflake classe les colonnes sources dans l’un des types suivants, ce qui affecte la manière dont les données synthétiques sont générées :
Clé de jointure Peut être de n’importe quel type de données. Les colonnes de clés de jointure sont déclarées explicitement par l’utilisateur. Une valeur synthétique cohérente est générée dans les données de sortie pour la même valeur dans les données sources pour toutes les clés de jointure dans toutes les tables au cours d’une seule exécution. Cela vous permet d’exécuter des requêtes conjointes et d’obtenir des résultats similaires à ceux que vous obtiendriez en exécutant la même requête sur les données sources.
Données statistiques : Données de type nombre, booléen, date, heure ou horodatage. Des valeurs artificielles du même type sont générées, avec une distribution statistique similaire dans les données de sortie.
Chaîne catégorique Une colonne de chaînes avec quelques valeurs uniques*. Les valeurs réelles sont utilisées dans les données générées avec une distribution statistique similaire à celle des données sources.
Chaîne non catégorielle Une colonne de chaînes avec plusieurs valeurs uniques*. Exprimé dans la sortie.
* Peu de valeurs uniques signifie que le nombre de valeurs uniques est inférieur à la moitié du nombre de lignes. Beaucoup de valeurs uniques signifie que le nombre de valeurs uniques est supérieur à la moitié du nombre de lignes.
Générer des données synthétiques¶
Appelez la procédure stockée SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA pour générer des données synthétiques à partir d’une ou plusieurs tables. Snowflake crée automatiquement des tables dont la propriété est accordée au rôle qui appelle la procédure stockée. Les tables de sortie ont le même nombre de colonnes que les tables d’entrée, avec les mêmes noms de colonnes et les mêmes types de données. La sortie comporte généralement le même nombre de lignes, sauf si vous activez le filtre de confidentialité ou si la table d’entrée comporte des valeurs nulles, auquel cas les tables de sortie peuvent comporter moins de lignes.
Exécution de requêtes conjointes sur des données synthétiques¶
Si vous planifiez d’exécuter des requêtes de jointure sur vos données synthétiques, désignez chaque colonne sur laquelle vous ferez une jointure comme une clé de jointure. Le générateur synthétique produira la même valeur synthétique à partir de la même valeur source dans toutes les colonnes marquées comme clés de jointure. En d’autres termes, dans toutes les colonnes de la clé de jointure, la valeur source « Europe » se traduira par la même valeur synthétique dans les tables générées.
Si vous prévoyez d’exécuter des requêtes de jointure multitables sur les données synthétiques, exécutez GENERATE_SYNTHETIC_DATA avec toutes les tables que vous prévoyez d’utiliser dans votre requête, en spécifiant les colonnes qui seront utilisées comme clés de jointure. Les colonnes désignées comme clés de jointure auront une valeur synthétique cohérente pour la même valeur source dans toutes les tables, ce qui fait que ces requêtes se comportent de la même manière sur les données synthétiques et les données originales.
Les clés de jointure génèrent des valeurs synthétiques cohérentes au cours d’une même exécution. L’exécution de la procédure une deuxième fois ne générera pas les mêmes valeurs pour les clés de jointure, même en cas de nouvelle exécution d’une requête identique.
Filtrer les données synthétiques¶
Lorsque vous appelez la procédure stockée GENERATE_SYNTHETIC_DATA, vous pouvez éventuellement définir l’option de configuration 'privacy_filter': True
pour appliquer un filtre de confidentialité à la table de sortie. Le filtre de confidentialité supprime les lignes de la table de sortie si les lignes sont trop similaires à l’ensemble des données d’entrée. Le seuil de confidentialité utilise les valeurs du rapport de distance du plus proche voisin (NNDR) et de la distance à l’enregistrement le plus proche (DCR) pour déterminer si une ligne doit être supprimée de la table de sortie.
Exigences¶
Exigences relatives à la table d’entrée¶
Les tables et les vues sont prises en charge en tant que données sources. Vous pouvez spécifier jusqu’à cinq tables d’entrée par appel de procédure.
Pour générer des données synthétiques, chaque table ou vue d’entrée doit répondre aux exigences suivantes :
Au moins 20 lignes distinctes
Maximum 100 colonnes
Maximum 2,3 millions de lignes
Les types de données suivants sont pris en charge. Les colonnes dont le type de données n’est pas pris en charge renvoient NULL pour toutes les valeurs de la colonne.
Tous les types numériques (NUMBER, DECIMAL, FLOAT, INTEGER, etc.)
BOOLEAN
Tous les types de date et d’heure (DATE, DATETIME, TIME, TIMESTAMP, etc.) sauf TIMESTAMP_TZ
STRING, VARCHAR, CHAR, CHARACTER, TEXT
Si plus de la moitié des valeurs d’une colonne STRING sont des valeurs uniques, Snowflake remplace la valeur par une valeur expurgée dans la table de sortie pour des raisons de confidentialité.
Exigences en matière de contrôle d’accès¶
Pour générer des données synthétiques, vous devez utiliser un rôle doté de chacune des autorisations suivantes :
USAGE sur l’entrepôt que vous souhaitez utiliser pour les requêtes.
SELECT sur la table d’entrée à partir de laquelle vous souhaitez générer des données synthétiques.
USAGE sur la base de données et le schéma qui contiennent la table d’entrée, et sur la base de données qui contient la table de sortie.
CREATE TABLE sur le schéma qui contient la table de sortie.
OWNERSHIP sur les tables de sortie. La façon la plus simple de procéder est d’accorder l’autorisation OWNERSHIP au schéma dans lequel la table de sortie est générée. (Toutefois, si quelqu’un a appliqué un FUTURE GRANT sur ce schéma, la propriété de la table sera remplacée en silence, c’est-à-dire que
GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA db.my_schema TO ROLE some_role
accordera automatiquement OWNERSHIP àsome_role
sur toutes les nouvelles tables créées dans le schémamy_schema
)
Tous les utilisateurs peuvent accéder à la procédure stockée SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA. L’accès est possible en utilisant le rôle de base de données SNOWFLAKE.CORE_VIEWER, qui est accordé au rôle PUBLIC.
Autres exigences¶
Vous devez accepter les termes et conditions d’Anaconda dans votre compte Snowflake afin d’activer cette fonction.
Recommandations¶
Utilisez un entrepôt optimisé par Snowpark de taille moyenne.
Pendant l’exécution de
GENERATE_SYNTHETIC_DATA
, n’exécutez aucune autre requête dans cet entrepôt.
Exemple : Données synthétiques provenant de plusieurs tables¶
Cet exemple utilise la base de données Snowflake Sample Data SNOWFLAKE_SAMPLE_DATA. Si vous ne le voyez pas dans votre compte, vous pouvez le copier à l’aide des commandes suivantes :
USE ROLE ACCOUNTADMIN;
CREATE or REPLACE DATABASE SNOWFLAKE_SAMPLE_DATA from share SFC_SAMPLES.SAMPLE_DATA;
Suivez les étapes suivantes pour générer des données synthétiques à partir de plusieurs tables d’entrée :
Créez et configurez le contrôle d’accès pour le rôle
data_engineer
afin de lui permettre de créer tous les objets nécessaires :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.
Créez deux vues à partir de la base de données 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 );
Effectuez une requête dans les tables d’entrée pour voir les données et confirmez que chaque table comporte 5 000 lignes :
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;
Appelez la procédure stockée GENERATE_SYNTHETIC_DATA pour générer les données synthétiques dans deux tables de sortie. Désignez des clés de jointure, car vous ferez la jointure sur ces clés plus tard.
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 });
Effectuez une requête dans la table de sortie pour voir les données synthétiques :
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;
Nettoyer tous les objets
USE ROLE ACCOUNTADMIN; DROP DATABASE syndata_db; DROP ROLE data_engineer; DROP WAREHOUSE syndata_wh;