プライバシードメインについて

Snowflakeの差分プライバシー 内で、 プライバシードメイン は、数学のドメインと同様、列の可能な値を定義します。プライバシードメインは、最小値と最大値を持つ値の範囲か、値の列挙リストのいずれかです。

プライバシードメインは、Snowflakeがプライバシーを維持するために付加しなければならない ノイズ の量を計算するために使用する1つの要素です。このため、ほとんどのフィールドは有限のプライバシードメインを持つはずです。そうでなければ、付加するノイズの量を無限にする必要が生じてしまいます。デフォルトでは、プライバシードメインのないフィールドは、無限ドメインを持つと想定されます。

プライバシードメインが必要な列

COUNT 関数を除いて、列にプライバシードメインがない限り、クエリで列を集計することはできません。同様に、 GROUP BY 句では、列にプライバシードメインがない限り、クエリで列を使用することはできません。例えば、以下のクエリでは、スコアはプライバシー・ドメインが必要ですが、年齢は必要ありません。

SELECT COUNT(age) AS count_age where age >= 20 and age <= 100 FROM t1 GROUP BY score

プライバシードメインの定義

管理者もクエリを実行するアナリストも列のプライバシードメインを定義できますが、その方法は異なります。

  • 管理者は、 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

domainL と domainR の交差

OUTER

domainL と domainR の結合

LEFT

domainL

RIGHT

domainR

LEFT SEMI

domainL と domainR の交差

LEFT ANTI

domainL

たとえば、 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つのテーブルの結合 がプライバシードメインの交差をもたらす場合、クエリ時のプライバシードメイン外の値はクランプされます。

アナリスト指定:

アナリストがプライバシードメインを持たない列にプライバシードメインを指定したり、管理者が指定したプライバシードメインを狭めたりする場合、クエリ自体がプライバシードメイン外にある値をどうするかを決定します。

  • クエリがフィルター(WHERE 句)を使用する場合、集計を行う際にプライバシードメイン外の値は無視されます。

  • クエリが 列変換 を使用する場合、プライバシードメイン外にある列の値は、管理者が指定したプライバシードメインのようにクランプされます。

中間クエリ要素がプライバシードメインに与える影響

クエリを書く方法は、プライバシードメインの範囲が変わるかどうか、あるいはプライバシードメインがカラムにまだ存在するかどうかに影響します。このセクションは、クエリの中間部分、つまり最終的な集計の前にあるクエリの部分が、列のプライバシードメインにどのような影響を与えるかを理解するのに役立ちます。

新しい列の追加

クエリが既存の列に基づく新しい列を追加する場合、元の列でプライバシードメインを指定したり狭めたりしても、新しい列には影響しません。

以下の例では、データプロバイダーが score 列のプライバシードメインを0から100の範囲として定義したと想定します。クエリが score のプライバシードメインを1と2の間の範囲として指定する場合、列 score_derived のプライバシードメインには影響はありません。

SELECT COUNT(score_derived)
  FROM (SELECT score, score_derived FROM t1 WHERE score <= 2);

たとえば、出力は次のようになります。

----------------------------
|"count(""SCORE_DERIVED"")"|
----------------------------
|31                        |
----------------------------
中間集計での GROUP BY 句の使用

クエリの中間部分では、 GROUP BY 句を使用して列を集計すると、列からプライバシードメインが削除されます。その結果、クエリの最終的な集計でその列を使用する場合は、新しいプライバシードメインを指定する必要があります。

以下の例では、最初の集計によって score 列に設定されているプライバシードメインが削除されます。このクエリが成功するのは、最終的な集計の前に、列のエイリアスにプライバシードメインを設定しているためです。

SELECT COUNT(num_scores)
  FROM (SELECT COUNT(score) AS num_scores
    FROM t1
    GROUP BY age)
  WHERE num_scores >= 0 AND num_scores <= 100;