
Classificationを用いて個人情報を持つカラムを自動分類・自動タグ付けをしてみた #SnowflakeDB
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
※本エントリは、Snowflakeをもっと使いこなそう! Advent Calendar 2022の15日目の記事となります。
さがらです。
SnowflakeのClassificationを用いて個人情報を持つカラムを自動分類・自動タグ付けを試してみたので、その内容をまとめてみます。
Classificationとは
Snowflake社が事前構築済の機械学習モデルを用いて、テーブル内の各カラムの内容とメタデータを分析し、個人情報に分類し、分類された内容に基づいてタグ付けまで行うことができる機能です。
Snowflakeには元々、タグ付けの機能やタグベースのマスキングポリシーなどの機能はありますが、これらの機能は基本的には管理者が手動でタグ付けをしないといけません。しかし、このClassificationを使うことで、Snowflakeが事前構築した機械学習モデルに合致するカラムであれば、自動でタグ付けを行うことが可能です。
下図はSnowflake公式のブログからの引用ですが、このような個人情報に分類することができるようです。

試してみた
早速、Classificationを試してみたいと思います!
対象のテーブル
SNOWFLAKE_SAMPLE_DATAデータベースのTPCDS_SF10TCLスキーマの、CUSTOMERテーブルから先頭1万行だけをSELECTしてテーブルを作成し、このテーブルを対象とします。カラム数は18個あります。
データの内容としては下図のような内容になります。名前、3カラムに分かれた生年月日、メールアドレス、などの個人情報が含まれていますね。



EXTRACT_SEMANTIC_CATEGORIES関数を使い、推奨されるタグを確認
まず、EXTRACT_SEMANTIC_CATEGORIESという関数を用いて、Classification機能により各カラムに対して推奨されるタグの値を確認してみます。
実行するSQLは下記のようになります。引数は1つだけで対象のテーブル名を入れればOKです。
-- タグの推奨値の確認
select extract_semantic_categories('customer');
XSのシングルクラスタのウェアハウスで実行してみると、40秒ほど経って結果が返ってきました。結果はJSON形式で返ってきます。分類されたカラムには4つの値が付与されていることがわかります。

この分類されたカラムが持つ4つの値ですが、このような仕様となっております。
- extra_info.alternates:- semantic_categoryに示した値が正しい確率が80%未満である時に表示される、値の代替案(代替案の正しい確率は、15%~80%の間のようです。)
- extra_info.probability:- semantic_categoryに示した値が正しい確率。"1.00"が最高で、100%を意味する
- privacy_category:Classification機能により生成される- PRIVACY_CATEGORYというタグに紐づける値。- IDENTIFIER、- QUASI_IDENTIFIER、- SENSITIVEの3種類。
- semantic_category:Classification機能により生成される- SEMANTIC_CATEGORYというタグに紐づける値。詳細はこちらの公式Docをご確認ください。
結果を見ると、下記の5つのカラムに対して結果が返ってきていました。
- C_BIRTH_COUNTRY- extra_info.alternates:[]
- extra_info.probability:"0.99"
- privacy_category:"QUASI_IDENTIFIER"
- semantic_category:"COUNTRY"
 
- C_BIRTH_YEAR- extra_info.alternates:[]
- extra_info.probability:"0.96"
- privacy_category:"QUASI_IDENTIFIER"
- semantic_category:"YEAR_OF_BIRTH"
 
- C_EMAIL_ADDRESS- extra_info.alternates:[]
- extra_info.probability:"1.00"
- privacy_category:"IDENTIFIER"
- semantic_category:"EMAIL"
 
- C_FIRST_NAME- extra_info.alternates:[]
- extra_info.probability:"1.00"
- privacy_category:"IDENTIFIER"
- semantic_category:"NAME"
 
- C_LAST_NAME- extra_info.alternates:[]
- extra_info.probability:"1.00"
- privacy_category:"IDENTIFIER"
- semantic_category:"NAME"
 
個人的には、C_BIRTH_MONTHとC_BIRTH_DAYが検知されていなかったのが気になったのですが、ClassificationではDATE_OF_BIRTHというsemantic_categoryはあるものの、MONTHとDAYに分かれている場合は対応が難しいようですね。
ASSOCIATE_SEMANTIC_CATEGORY_TAGSストアドプロシージャを用いてタグ付けを行う
続いて、ASSOCIATE_SEMANTIC_CATEGORY_TAGSというストアドプロシージャを用いて、EXTRACT_SEMANTIC_CATEGORIES関数が返した分類でタグ付けを行います。
実行するSQLは下記のようになります。1つ目の引数に対象のテーブル名、2つ目の引数にはEXTRACT_SEMANTIC_CATEGORIES関数を指定することで実行可能です。
-- タグ付けの実行
call associate_semantic_category_tags('customer',extract_semantic_categories('customer'));
XSのシングルクラスタのウェアハウスで実行してみると、38秒ほど経って結果が返ってきました。

では、正しくタグが付与されているかを確認してみます!
ACCOUNT_USAGEのTAG_REFERENCESビューからも確認可能なのですが、すぐに反映されないため、INFORMATION_SCHEMAのTAG_REFERENCESテーブル関数を用いて、C_LAST_NAMEにタグが適用されたかを確認してみます。
-- `C_LAST_NAME`列にタグ付けされたことを確認
select * from table(sagara_rawdata_db.information_schema.tag_references('customer.c_last_name', 'COLUMN'));
下図が上述のクエリを実行して返って来た結果ですが、無事に2つのタグが付与されていることを確認できました!


あとは、マスキングポリシーを各タグに適用すれば、自分でタグ付けをセずともマスキングが行なえますね!(タグベースのマスキングポリシーについては、先日ブログを書いておりますのでこちらも併せてご覧ください。)
最後に
SnowflakeのClassificationを用いて個人情報を持つカラムを自動分類・自動タグ付けを試してみました。
記事に書いたクエリを見るとわかると思いますが、非常に簡単に実装可能です!まずは一度EXTRACT_SEMANTIC_CATEGORIES関数を使っていただいて、どのように分類されるか確認してみることをオススメします。










