À propos des domaines de confidentialité¶
Dans la confidentialité différentielle de Snowflake, un domaine de confidentialité définit les valeurs possibles dans une colonne, de manière similaire à un domaine mathématique. Un domaine de confidentialité est soit une plage de valeurs avec un minimum et un maximum, soit une liste de valeurs.
Le domaine de confidentialité est un facteur que Snowflake utilise pour calculer la quantité de bruit qui doit être ajoutée pour préserver la confidentialité. Pour cette raison, la plupart des domaines devraient avoir un domaine de confidentialité fini, sinon, la quantité de bruit ajoutée devrait être infinie. Par défaut, les champs sans domaines de confidentialité sont supposés avoir un domaine infini.
Quelles colonnes ont besoin d’un domaine de confidentialité ?¶
À l’exception d’une fonction COUNT, une requête ne peut pas agréger une colonne à moins que la colonne n’ait un domaine de confidentialité. De même, une requête ne peut pas utiliser une colonne dans une clause GROUP BY sauf si la colonne possède un domaine de confidentialité. Par exemple, les colonnes score
et age
de l’exemple suivant doivent avoir des domaines de confidentialité.
SELECT AVG(age) FROM t1
GROUP BY score;
df.group_by("score").agg(f.mean("age").as_("mean_age")).show()
Ces exigences ne s’appliquent pas aux sous-requêtes. Par exemple, dans la requête suivante, la colonne mean_age
doit avoir un domaine de confidentialité, mais les colonnes score
et age
n’en ont pas, même si elles sont utilisées dans une agrégation.
SELECT AVG(mean_age)
FROM (SELECT AVG(age) AS mean_age FROM t1 GROUP BY score)
WHERE mean_age >= 20 AND mean_age <= 80;
df.group_by("score").agg(f.mean("age").as_("mean_age")) \
.where((f.col("mean_age") >= 20) & (f.col("mean_age") <= 80)) \
.select(f.mean("mean_age")).show()
Définition d’un domaine de confidentialité¶
Bien que les administrateurs et les analystes qui exécutent des requêtes puissent définir un domaine de confidentialité pour une colonne, ils le font de différentes manières :
Un administrateur utilise les commandes CREATE TABLE et ALTER TABLE pour définir un domaine de confidentialité pour une colonne. Un administrateur du fournisseur de données définit les domaines de confidentialité avant de donner l’accès aux analystes. Dans certaines circonstances, un administrateur de l’analyste peut également avoir besoin de définir des domaines de confidentialité sur les tables jointes aux tables protégées du fournisseur de données. Si vous êtes un administrateur qui doit définir des domaines de confidentialité, voir Utilisation des domaines de confidentialité en tant qu’administrateur.
Un analyste façonne une requête pour spécifier implicitement un domaine de confidentialité à l’aide d’éléments de requête tels que des filtres et des transformations de colonnes. Ces domaines de confidentialité peuvent être spécifiés pour les colonnes sans domaine de confidentialité ou peuvent restreindre un domaine de confidentialité défini par le fournisseur de données. Si vous êtes un analyste qui doit spécifier ou restreindre un domaine de confidentialité, voir Utilisation des domaines de confidentialité en tant qu’analyste.
Interactions entre les domaines de confidentialité¶
Plusieurs domaines de confidentialité peuvent être impliqués dans une requête. Il peut y avoir un domaine de confidentialité spécifié par l’administrateur et un domaine de confidentialité spécifié par l’analyste sur la même colonne. Alternativement, une requête peut joindre deux tables sur une colonne qui possède un domaine de confidentialité dans les deux tables.
Snowflake évalue tous les domaines de confidentialité et calcule le domaine de confidentialité à utiliser pendant la durée de la requête. Pour plus d’informations sur la manière dont ce domaine de confidentialité au moment de la requête est déterminé, voir :
Interaction entre les domaines de confidentialité spécifiés par l’administrateur et ceux spécifiés par l’analyste¶
Un analyste utilise des éléments de requête pour spécifier implicitement un domaine de confidentialité pour une colonne. Par exemple, le filtrage sur une colonne définit un domaine de confidentialité pour celle-ci. Ce domaine de confidentialité spécifié par l’analyste existe uniquement pendant la durée de la requête ; il ne modifie pas le domaine de confidentialité défini par un administrateur sur la colonne.
Un domaine de confidentialité spécifié par un analyste peut restreindre un domaine de confidentialité spécifié par un administrateur, mais ne peut jamais l’étendre. Le domaine de confidentialité au moment de la requête est l’intersection entre le domaine de confidentialité spécifié par la requête et le domaine de confidentialité défini par l’administrateur. Par exemple, si le fournisseur de données définit le domaine de confidentialité comme une plage (5, 15) et que la requête utilise des filtres pour spécifier le domaine de confidentialité comme une plage (0, 10), alors le domaine de confidentialité effectif au moment de la requête est (5, 10).
De même, si l’administrateur définit le domaine de confidentialité sous forme de liste (“bleu”, “jaune”) et que la requête utilise des filtres pour spécifier un domaine de confidentialité (“orange”, “bleu”), le domaine de confidentialité au moment de la requête est (“bleu”).
Domaines et jointures de confidentialité¶
Lorsqu’un analyste joint deux tables sur une colonne comportant un domaine de confidentialité dans les deux tables, le type de jointure détermine le domaine de confidentialité au moment de la requête. Pendant la durée de la requête, le domaine de confidentialité effectif peut être l’intersection des deux domaines de confidentialité, l’union des deux domaines de confidentialité ou simplement l’un des domaines de confidentialité.
Dans le tableau suivant, domainL
fait référence au domaine de confidentialité sur la colonne de jointure dans la table de gauche et domainR
fait référence au domaine de confidentialité sur la colonne de jointure dans la table de droite.
Type de jonction |
Domaine de confidentialité au moment de la requête |
---|---|
INNER |
Intersection de |
OUTER |
Union de |
LEFT |
|
RIGHT |
|
LEFT SEMI |
Intersection de |
LEFT ANTI |
|
Par exemple, supposons que la colonne day
dans t1
a un domaine de confidentialité de (1, 100) et que la colonne day
dans t2
a un domaine de confidentialité de (0, 90). Lorsqu’un analyste rejoint t1
et t2
sur day
, le domaine de confidentialité au moment de la requête est (1, 90), qui est l’intersection des deux domaines de confidentialité.
Valeurs en dehors d’un domaine de confidentialité¶
Un domaine de confidentialité définit des valeurs possibles dans une colonne, pas nécessairement des valeurs réelles. Ce qui suit résume ce qui se passe pour les valeurs qui ne sont pas incluses dans la liste ou la plage du domaine de confidentialité.
- Chaînes
Les valeurs d’une colonne de chaîne qui se situent en dehors du domaine de confidentialité sont toujours traitées comme NULL pendant la durée de la requête. Cela est vrai qu’il s’agisse d’un domaine de confidentialité spécifié par l’administrateur, d’un domaine de confidentialité spécifié par l’analyste ou d’une intersection de domaines de confidentialité.
Par exemple, supposons que le fournisseur de données définisse un domaine de confidentialité sur une colonne
state
de ('california'
,'oregon'
) et l’analyste a écrit une requête qui filtre la colonnestate
sur ('nevada'
,'oregon'
). Si la requête utilise la colonnestate
dans une clause GROUP BY, alors le résultat contient deux groupes :OREGON
etNULL
. Le groupeNULL
inclut tous les enregistrements où la valeur de la colonnestate
n’est pasOREGON
ainsi que des enregistrements où la valeur de la colonnestate
est littéralementNULL
.
- Numérique, date et heure
Snowflake traite les valeurs numériques, de date ou d’heure qui se situent en dehors de la plage d’un domaine de confidentialité différemment selon que le domaine de confidentialité a été défini par un administrateur ou un analyste.
- Spécifié par l’administrateur:
Lorsque le fournisseur de données définit un domaine de confidentialité de plage qui contient un sous-ensemble des valeurs réelles de la colonne, les valeurs en dehors du domaine de confidentialité sont limitées, ce qui signifie qu’elles sont traitées comme si elles étaient la valeur la plus proche du domaine (la valeur minimale ou maximale). Par exemple, si le domaine de confidentialité d’une colonne se compose d’entiers compris entre 1 et 100, un enregistrement avec une valeur réelle de 105 est traité comme s’il avait une valeur de 100 lors du calcul des agrégations. Les analystes ne peuvent pas accéder aux valeurs en dehors du domaine de confidentialité.
Lorsqu’une jointure de deux tables protégées par la confidentialité entraîne l’intersection des domaines de confidentialité, les valeurs en dehors du domaine de confidentialité au moment de la requête sont bloquées.
- Spécifié par l’analyste:
Lorsqu’un analyste spécifie un domaine de confidentialité pour une colonne qui n’en a pas ou restreint un domaine de confidentialité spécifié par l’administrateur, la requête elle-même détermine ce qui arrive aux valeurs qui se trouvent en dehors du domaine de confidentialité.
Si la requête utilise un filtre (clause WHERE), les valeurs en dehors du domaine de confidentialité sont ignorées lors du calcul des agrégations.
Si la requête utilise une transformation de colonne, les valeurs de la colonne qui sont en dehors du domaine de confidentialité sont limitées comme un domaine de confidentialité spécifié par l’administrateur.
Comment les éléments de requête intermédiaires affectent les domaines de confidentialité¶
La manière dont une requête est écrite peut avoir une incidence sur la modification de la plage d’un domaine de confidentialité ou même sur l’existence ou non d’un domaine de confidentialité sur une colonne. Cette section vous aide à comprendre comment les parties intermédiaires d’une requête, c’est-à-dire les parties de la requête avant l’agrégation finale, peuvent affecter le domaine de confidentialité d’une colonne.
- Ajout de nouvelles colonnes
Si une requête ajoute une nouvelle colonne basée sur une colonne existante, la spécification ou la restriction d’un domaine de confidentialité sur la colonne d’origine n’a aucun effet sur la nouvelle colonne.
Dans l’exemple suivant, supposons que le fournisseur de données a défini le domaine de confidentialité sur la colonne
score
sous forme de plage comprise entre 0 et 100. Lorsque la requête spécifie le domaine de confidentialité descore
en tant que plage comprise entre 1 et 2, elle n’a aucun effet sur le domaine de confidentialité de la colonnescore_derived
.
SELECT AVG(score_derived)
FROM (SELECT score, score_derived FROM t1 WHERE score <= 2);
df.with_column("score_derived", f.col("score")) \
.where((f.col("score") >= 1) & \
(f.col("score") <= 2)) \
.select(f.mean("score_derived")).show()
Par exemple, le résultat pourrait être :
--------------------------
|"avg(""SCORE_DERIVED"")"|
--------------------------
|31.8196209349 |
--------------------------
- Utilisation d’une clause GROUP BY dans les agrégations intermédiaires
Pour les parties intermédiaires d’une requête, l’utilisation d’une clause GROUP BY lors de l’agrégation d’une colonne supprime le domaine de confidentialité de la colonne. Par conséquent, vous devez spécifier un nouveau domaine de confidentialité sur la colonne si elle est utilisée dans l’agrégation finale de la requête.
Dans l’exemple suivant, l’agrégation initiale supprime tout domaine de confidentialité qui a été défini sur la colonne
score
. La requête réussit uniquement parce qu’elle définit un domaine de confidentialité sur l’alias de la colonne avant l’agrégation finale.
SELECT AVG(num_scores)
FROM (SELECT COUNT(score) AS num_scores
FROM t1
GROUP BY age)
WHERE num_scores >= 0 AND num_scores <= 100;
df.group_by("age").agg(f.count("score").as_("num_scores")) \
.where((f.col("num_scores") >= 0) & (f.col("num_scores") <= 100)) \
.select(f.mean("num_scores")).show()