プライバシードメインについて¶
Snowflakeの差分プライバシー 内で、 プライバシードメイン は、数学のドメインと同様、列の可能な値を定義します。プライバシードメインは、最小値と最大値を持つ値の範囲か、値の列挙リストのいずれかです。
プライバシードメインは、Snowflakeがプライバシーを維持するために付加しなければならない ノイズ の量を計算するために使用する1つの要素です。このため、ほとんどのフィールドは有限のプライバシードメインを持つはずです。そうでなければ、付加するノイズの量を無限にする必要が生じてしまいます。デフォルトでは、プライバシードメインのないフィールドは、無限ドメインを持つと想定されます。
プライバシードメインが必要な列¶
COUNT 関数を除いて、列にプライバシードメインがない限り、クエリで列を集計することはできません。同様に、 GROUP BY 句では、列にプライバシードメインがない限り、クエリで列を使用することはできません。たとえば、以下の例の score
と age
の両列は、プライバシードメインを持っていなければなりません。
SELECT AVG(age) FROM t1
GROUP BY score;
df.group_by("score").agg(f.mean("age").as_("mean_age")).show()
これらの要件はサブクエリには適用されません。たとえば、以下のクエリでは、 mean_age
列はプライバシードメインを持っていなければなりませんが、 score
列と age
列は、集計で使用されているにもかかわらず、プライバシードメインを持っていません。
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()
プライバシードメインの定義¶
管理者もクエリを実行するアナリストも列のプライバシードメインを定義できますが、その方法は異なります。
管理者は、 CREATE TABLE コマンドと ALTER TABLE コマンドを使用して、列にプライバシードメインを設定します。データプロバイダーの管理者は、アナリストにアクセス権を与える前にプライバシードメインを設定します。 状況によっては、アナリストの管理者もデータプロバイダーの保護されたテーブルと結合するテーブルにプライバシードメインを設定する必要が生じる場合があります。プライバシードメインを設定する必要がある管理者は、 管理者としてのプライバシードメインの操作 をご参照ください。
アナリストは、フィルターや列変換のようなクエリ要素を使用して、プライバシードメインを暗黙的に指定するためにクエリを形成します。これらのプライバシードメインについては、プライバシードメインのない列に指定することも、データプロバイダーが設定したプライバシードメインを狭めることもできます。プライバシードメインを指定したり、狭めたりする必要があるアナリストは、 アナリストとしてのプライバシードメインの操作 をご参照ください。
プライバシードメイン間の相互作用¶
1つのクエリに複数のプライバシードメインが含まれることがあります。管理者指定のプライバシードメインとアナリスト指定のプライバシードメインが同じ列に存在することがあります。あるいは、2つのテーブルを、クエリによって両テーブルにプライバシードメインを持つ列で結合する場合もあります。
Snowflakeはすべてのプライバシードメインを評価し、クエリの間に使用するプライバシードメインを計算します。このクエリ時のプライバシードメインの決定方法については、次をご参照ください。
管理者指定のプライバシードメインとアナリスト指定のプライバシードメインの相互作用¶
アナリストはクエリ要素を使用して、列のプライバシードメインを暗黙的に指定します。たとえば、ある列をフィルタリングすると、その列のプライバシードメインが定義されます。このアナリスト指定のプライバシードメインは、クエリの間のみ存在します。管理者が列に設定したプライバシードメインは変更されません。
アナリスト指定のプライバシードメインは、管理者指定のプライバシードメインを狭めることはできますが、広げることはできません。クエリ時のプライバシードメインは、クエリによって指定されたプライバシードメインと、管理者によって設定されたプライバシードメインとの交差です。たとえば、データプロバイダーがプライバシードメインを(5, 15)の範囲に設定し、クエリがフィルターを使用してプライバシードメインを(0, 10)の範囲に指定した場合、有効なクエリ時のプライバシードメインは(5, 10)となります。
同様に、管理者がプライバシードメインをリスト('blue', 'yellow')として設定し、クエリがフィルターを使用してプライバシードメインを('orange', 'blue')と指定した場合、クエリ時のプライバシードメインは('blue')となります。
プライバシードメインと結合¶
アナリストが2つのテーブルでプライバシードメインを持つ列を結合する場合、結合タイプによってクエリ時のプライバシードメインが決まります。クエリの間、有効なプライバシードメインは、2つのプライバシードメインの交差、2つのプライバシードメインの結合、または1つのプライバシードメインのいずれかになります。
以下のテーブルでは、 domainL
は左のテーブルの結合列のプライバシードメインを指し、 domainR
は右のテーブルの結合列のプライバシードメインを指します。
結合タイプ |
クエリ時のプライバシードメイン |
---|---|
INNER |
|
OUTER |
|
LEFT |
|
RIGHT |
|
LEFT SEMI |
|
LEFT ANTI |
|
たとえば、 t1
の day
列が(1, 100)のプライバシードメインを持ち、 t2
の day
列が(0, 90)のプライバシードメインを持つとします。アナリストが t1
と t2
を day
で結合する場合、クエリ時のプライバシードメインは、2つのプライバシードメインの交差(1, 90)となります。
プライバシードメイン外の値¶
プライバシードメインは、列の 可能な 値を定義するものであり、必ずしも 実際の 値を定義するものではありません。以下は、プライバシードメインのリストや範囲に含まれない値がどうなるかをまとめたものです。
- 文字列
プライバシードメイン外にある文字列列の値は、クエリの間、常に NULL として扱われます。これは、管理者指定のプライバシードメインであっても、アナリスト指定のプライバシードメインであっても、プライバシードメインの交差であっても同じです。
たとえば、データプロバイダーが
state
列に('california'
,'oregon'
)のプライバシードメインを設定し、アナリストがstate
列を('nevada'
,'oregon'
)にフィルタリングするクエリを書いたとします。クエリが GROUP BY 句でstate
列を使用する場合、結果にはOREGON
とNULL
の2つのグループが含まれます。NULL
グループには、state
列の値がOREGON
でないすべての記録と、state
列の値が文字通りNULL
である記録が含まれます。
- 数値、日付、時刻
Snowflakeがプライバシードメインの範囲外にある数値、日付、または時刻の値をどう扱うかは、プライバシードメインが管理者によって定義されたか、アナリストによって定義されたかによって異なります。
- 管理者指定:
データプロバイダーが列の実際の値のサブセットを含む範囲のプライバシードメインを定義すると、プライバシードメイン外の値は クランプ され、ドメイン内で最も近い値(最小値または最大値)であるかのように扱われます。たとえば、列のプライバシードメインが1~100の整数で構成されている場合、実際の値が105の記録は、集計を行うときに値が100であるかのように扱われます。アナリストは、プライバシードメイン外の値にアクセスすることはできません。
プライバシー保護された2つのテーブルの結合 がプライバシードメインの交差をもたらす場合、クエリ時のプライバシードメイン外の値はクランプされます。
- アナリスト指定:
アナリストがプライバシードメインを持たない列にプライバシードメインを指定したり、管理者が指定したプライバシードメインを狭めたりする場合、クエリ自体がプライバシードメイン外にある値をどうするかを決定します。
中間クエリ要素がプライバシードメインに与える影響¶
クエリを書く方法は、プライバシードメインの範囲が変わるかどうか、あるいはプライバシードメインがカラムにまだ存在するかどうかに影響します。このセクションは、クエリの中間部分、つまり最終的な集計の前にあるクエリの部分が、列のプライバシードメインにどのような影響を与えるかを理解するのに役立ちます。
- 新しい列の追加
クエリが既存の列に基づく新しい列を追加する場合、元の列でプライバシードメインを指定したり狭めたりしても、新しい列には影響しません。
以下の例では、データプロバイダーが
score
列のプライバシードメインを0から100の範囲として定義したと想定します。クエリがscore
のプライバシードメインを1と2の間の範囲として指定する場合、列score_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()
たとえば、出力は次のようになります。
--------------------------
|"avg(""SCORE_DERIVED"")"|
--------------------------
|31.8196209349 |
--------------------------
- 中間集計での GROUP BY 句の使用
クエリの中間部分では、 GROUP BY 句を使用して列を集計すると、列からプライバシードメインが削除されます。その結果、クエリの最終的な集計でその列を使用する場合は、新しいプライバシードメインを指定する必要があります。
以下の例では、最初の集計によって
score
列に設定されているプライバシードメインが削除されます。このクエリが成功するのは、最終的な集計の前に、列のエイリアスにプライバシードメインを設定しているためです。
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()