自定义 Data Classification¶
本主题提供有关 Snowflake 中自定义 Data Classification 的概念。
概述¶
Snowflake 在 SNOWFLAKE.DATA_PRIVACY 架构中提供 CUSTOM_CLASSIFIER 类,使数据工程师能够根据自己的数据知识扩展其 Data Classification 能力。创建该类的实例后,可以对该实例上调用一个方法来定义自己的语义类别、指定隐私类别,并指定正则表达式以匹配列值模式,同时可以选择匹配列名。
通过创建和使用自定义分类实例,您可以:
加速 Data Classification 工作。
为包含敏感数据的列定义行业和领域特定的标签。
利用 Snowflake 可以更好地控制您为跟踪 PII 数据而做的工作。
关于自定义分类算法¶
与 Data Classification 算法相比,Snowflake 使用的算法在自定义分类中是独一无二的。采用不同的分类算法的原因是为了确保根据您选择的数据分类方式获得稳定的结果。
自定义分类算法使用 评分规则 来确定推荐哪个语义类别系统标签,以及建议使用哪些语义类别标签(如果有)作为替代方案。评分逻辑会评估您添加到实例中的正则表达式,您可以通过对实例调用 custom_classifier!ADD_REGEX 方法来指定这些正则表达式。
评分规则使用默认阈值,该阈值等同于对推荐标签应具备的高置信度。该算法将列的分数与阈值进行比较,并推荐一个与以下值之一相对应的标签:
下表汇总了评分算法和推荐标签:
提供的名称匹配器 |
值匹配 >= 阈值 |
名称匹配 |
建议 |
---|---|---|---|
True |
True |
True |
自定义类别 |
False |
True |
Snowflake 类别 |
|
True |
False |
Snowflake 类别 |
|
False |
False |
Snowflake 类别 |
|
False |
True |
不适用 |
自定义类别 |
False |
不适用 |
Snowflake 类别 |
限制¶
目前,您只能使用 SQL 运行自定义分类器;不能使用 Snowsight 运行自定义分类器。
使用自定义分类器¶
自定义分类使用 CUSTOM_CLASSIFIER 类。您可以创建 CUSTOM_CLASSIFIER 类的实例并调用实例方法,来管理与实例相关的正则表达式。支持以下方法和 SQL 命令:
命令:
方法:
此外,您可以使用以下角色进行自定义分类:
SNOWFLAKE.CLASSIFICATION_ADMIN:数据库角色,使您能够创建自定义分类实例。
custom_classifier
!PRIVACY_USER:使您能够执行以下操作的 实例角色:通过对实例调用 ADD_REGEX 方法向该实例添加类别。
通过对实例调用 DELETE_CATEGORY 方法从实例中删除类别。
对拥有实例 OWNERSHIP 权限的账户角色可以执行以下操作:
使用 DROP CUSTOM_CLASSIFIER 命令删除实例。
使用 SHOW CUSTOM_CLASSIFIER 命令列出实例。
您可以将实例角色授予账户角色和数据库角色,以使其他用户能够使用自定义分类实例。例如:
GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!USER TO ROLE <role_name> REVOKE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!USER FROM ROLE <role_name> GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!USER TO DATABASE ROLE <database_role_name> REVOKE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!USER FROM DATABASE ROLE <database_role_name>其中:
name
指定您创建的自定义分类实例的名称。
role_name
指定账户角色的名称。
database_role_name
指定数据库角色的名称。
与其他 Snowflake 对象类似,创建自定义分类实例的角色会自动获得该实例的 OWNERSHIP 权限。
使用自定义分类器对数据进行分类的高级方法如下:
确定要分类的表。
使用 SQL 执行以下操作:
创建自定义分类实例。
向实例添加系统标签类别和正则表达式。
对表进行分类。
示例¶
完成以下步骤以创建用于对表进行分类的自定义分类器:
以一个
data.tables.patient_diagnosis
表为例,其中一列包含诊断代码,例如 ICD-10 代码 (link removed)。+-------------+----------------------------------------------------------+ | ICD_10_CODE | DESCRIPTION | +-------------+----------------------------------------------------------+ | G30.9 | Alzheimer's disease, unspecified | | G80.8 | Other cerebral palsy | | S13.4XXA | Sprain of ligaments of cervical spine, initial encounter | +-------------+----------------------------------------------------------+
该表还可能包括用于识别在医疗机构接受治疗的患者的列,例如名字和姓氏、唯一的健康保险标识符和出生日期。数据所有者可以对表进行分类,确保正确标记列,以便对表进行监控。
在此示例中,数据所有者已经为其角色授予了以下权限:
对表的 OWNERSHIP 权限,以便进行分类。
对包含表的架构的 OWNERSHIP 权限。
对包含架构和表的数据库的 USAGE 权限。
允许数据所有者通过将 SNOWFLAKE.CLASSIFICATION_ADMIN 数据库角色授予数据所有者角色来对表进行分类:
USE ROLE ACCOUNTADMIN; GRANT DATABASE ROLE SNOWFLAKE.CLASSIFICATION_ADMIN TO ROLE data_owner;
作为数据所有者,创建一个架构来存储您的自定义分类实例:
USE ROLE data_owner; CREATE SCHEMA data.classifiers;
使用 CREATE CUSTOM_CLASSIFIER 命令在
data.classifiers
架构中创建自定义分类实例:USE SCHEMA data.classifiers; CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER medical_codes();
更新您的 搜索路径 以使其更易于使用。
使用 SHOW CUSTOM_CLASSIFIER 命令列出您创建的每个实例。例如:
SHOW SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER;
返回:
+----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+ | created_on | name | database_name | schema_name | current_version | comment | owner | +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+ | 2023-09-08 07:00:00.123000+00:00 | MEDICAL_CODES | DATA | CLASSIFIERS | 1.0 | None | DATA_OWNER | +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+
对实例调用 custom_classifier!ADD_REGEX 方法来指定系统标签和正则表达式,以识别列中的 ICD-10 代码。此示例中的正则表达式匹配所有可能的 ICD-10 代码。匹配列名
ICD*
和注释的正则表达式是可选的:CALL medical_codes!ADD_REGEX( 'ICD_10_CODES', 'IDENTIFIER', '[A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4}', 'ICD*', 'Add a regex to identify ICD-10 medical codes in a column' );
返回:
+---------------+ | ADD_REGEX | +---------------+ | ICD_10_CODES | +---------------+
小技巧
在向自定义分类实例添加正则表达式之前,测试正则表达式。例如:
SELECT icd_10_code FROM medical_codes WHERE icd_10_code REGEXP('[A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4}');
+-------------+ | ICD-10-CODE | +-------------+ | G30.9 | | G80.8 | | S13.4XXA | +-------------+
在此查询中,仅返回与正则表达式匹配的有效值。该查询不会返回无效值,例如
xyz
。有关详细信息,请参阅 字符串函数(正则表达式)。
对实例调用 custom_classifier!LIST 方法以验证添加到实例的正则表达式:
SELECT medical_codes!LIST();
返回:
+--------------------------------------------------------------------------------+ | MEDICAL_CODES!LIST() | +--------------------------------------------------------------------------------+ | { | | "ICD-10-CODES": { | | "col_name_regex": "ICD*", | | "description": "Add a regex to identify ICD-10 medical codes in a column", | | "privacy_category": "IDENTIFIER", | | "value_regex": "[A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4}" | | } | +--------------------------------------------------------------------------------+
要删除类别,请对实例调用 custom_classifier!DELETE_CATEGORY 方法。
使用 SQL 对表进行分类。有关详细信息,请参阅 使用 SQL 对架构中的多个表进行分类。
如果不再需要实例,则使用 DROP CUSTOM_CLASSIFIER 命令从系统中移除自定义分类实例:
DROP SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER data.classifiers.medical_codes;