在 Snowflake 中使用合成数据¶
此预览版介绍了一种用于生成合成数据的新存储过程,GENERATE_SYNTHETIC_DATA。
概述¶
Snowflake 可以从源表生成 合成数据,生成一个与源表具有相同列数但包含人工数据的表。您可以使用合成数据来共享或测试过于敏感、机密或以其他方式限制与他人共享的数据。合成数据集具有与源数据集相同的特征,例如列的名称、编号和数据类型,以及相同或更少的行数。您可以使用合成数据来测试和验证 Snowflake 中的工作负载,特别是当原始数据为敏感数据且不应受到未经授权的用户访问时。
优势¶
- 统计一致性:
表示原始数据集统计特性的合成数据集,可以帮助数据工程师了解真实数据集的统计特性。随后,数据工程师可以测试和验证基于真实数据集的解决方案。
- 生产验证:
与生产数据集相似的合成数据集让生产工程师能够测试和验证其生产环境。从而让生产环境更加强大。
关于合成数据算法¶
Snowflake 使用算法生成与原始数据集相似的合成数据。该算法使用原始数据集生成与原始数据集具有相同统计特性的合成数据。该算法利用联接函数捕捉数据在列内和列间的分布。捕获分布后,合成数据将在统计上具有类似于原始数据的特征,但与原始数据中的任何行之间没有直接的引用或链接。
Snowflake 将源列分类为以下类型之一,这会影响合成数据的生成方式:
联接键 可以是任何数据类型。联接键列由用户显式声明。在单次运行中,对于所有表中的所有联接键,源数据中的相同值在输出数据中生成一致的合成值。这样您就能够运行联接查询,并获得与对源数据运行相同查询时相似的结果。
统计数据: 数字、布尔、日期、时间或时间戳类型的数据。生成相同类型的人工值,输出数据中具有类似的统计分布。
分类字符串 一个具有 少量 唯一值的字符串列*。生成的数据使用的实际值具有与源数据相似的统计分布。
非类别字符串 一个具有 许多 唯一值的字符串列*。已在输出中编辑。
* 少量唯一值 意味着唯一值的数量少于行数的一半。大量唯一值 意味着唯一值的数量超过行数的一半。
生成合成数据¶
调用 SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA 存储过程以从一个或多个表生成合成数据。Snowflake 自动创建表,并将所有权授予调用存储过程的角色。输出表的列数与输入表相同,列名和数据类型也相同。输出通常具有相同的行数,除非您启用隐私筛选器或输入表具有空值,在这种情况下,输出表可能具有更少的行。
对合成数据运行联接查询¶
如果您计划对合成数据运行联接查询,请将您将联接的每一列指定为 联接键。合成生成器将在所有标记为联接键的列中,从相同的源值生成相同的合成值。也就是说,在所有联接键列中,源值“Europe”将在生成的表中产生相同的合成值。
如果您计划对合成数据运行多表联接查询,请与您计划在查询中使用的所有表一起运行 GENERATE_SYNTHETIC_DATA,并指定将用作联接键的列。指定为联接键的列将在所有表中对相同的源值具有一致的合成值,这使得这些查询在合成数据和原始数据上表现得相似。
在单次运行中,联接键生成一致的合成值。第二次运行该过程不会为联接键生成相同的键值,即使重新运行相同的请求也是如此。
筛选合成数据¶
调用 GENERATE_SYNTHETIC_DATA 存储过程时,您可以选择性地设置 'privacy_filter': True
配置选项,以对输出表应用隐私过滤器。隐私过滤器会从输出表中删除与输入数据集过于相似的行。隐私阈值使用最近邻距离比 (NNDR) 和到最近记录的距离 (DCR) 值来确定是否应从输出表中删除一行。
要求¶
输入表格要求¶
支持表和视图作为源数据。您可以在每个过程调用中指定最多五个输入表。
要生成合成数据,每个 输入表或视图必须满足以下要求:
至少 20 行不同的内容
最多 100 列
最多 230 万行
支持以下数据类型。不支持数据类型的列针对列中的所有值返回 NULL。
所有数字类型(NUMBER、DECIMAL、FLOAT、INTEGER 等)
BOOLEAN
所有日期和时间类型(DATE、DATETIME、TIME、TIMESTAMP 等),除了 TIMESTAMP_TZ
STRING、VARCHAR、CHAR、CHARACTER、TEXT
如果 STRING 列中的值超过一半是唯一值,Snowflake 会因为隐私问题在输出表中用编辑后的值替换该值。
访问控制要求¶
要生成合成数据,您必须使用具有以下各项权限的角色:
要用于查询的仓库的 USAGE。
要生成合成数据的输入表的 SELECT。
包含输入表的数据库和架构以及包含输出表的数据库的 USAGE。
包含输出表的架构的 CREATE TABLE。
输出表的 OWNERSHIP。最简单的方法是将 OWNERSHIP 授予生成输出表的架构。(然而,如果有人在此架构上应用了 FUTURE GRANT,表的所有权将被静默覆盖,也就是说,
GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA db.my_schema TO ROLE some_role
会自动将 OWNERSHIP 授予在架构my_schema
中创建的任何新表的some_role
。)
所有用户都可以访问 SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA 存储过程。访问是通过使用 SNOWFLAKE.CORE_VIEWER 数据库角色实现的,其被授予 PUBLIC 角色。
其他要求¶
您必须在 Snowflake 账户中 接受 Anaconda 条款和条件 才能启用此功能。
建议¶
使用中型 Snowpark 优化型仓库。
GENERATE_SYNTHETIC_DATA
运行时,请勿在该仓库中运行其他查询。
示例:来自多个表的合成数据¶
此示例使用 Snowflake 示例数据数据库 SNOWFLAKE_SAMPLE_DATA。如果在账户中看不到该数据库,可以使用以下命令复制:
USE ROLE ACCOUNTADMIN;
CREATE or REPLACE DATABASE SNOWFLAKE_SAMPLE_DATA from share SFC_SAMPLES.SAMPLE_DATA;
按照以下步骤从多个输入表生成合成数据:
为
data_engineer
角色创建并配置访问控制,以允许他们创建所有必要的对象:USE ROLE ACCOUNTADMIN; CREATE OR REPLACE ROLE data_engineer; CREATE OR REPLACE DATABASE syndata_db; CREATE OR REPLACE WAREHOUSE syndata_wh; GRANT OWNERSHIP ON DATABASE syndata_db TO ROLE data_engineer; GRANT USAGE ON WAREHOUSE syndata_wh TO ROLE data_engineer; GRANT ROLE data_engineer TO USER jsmith; -- Or whoever you want to run this example. Or skip this line to run it yourself.
从 Snowflake 示例数据数据库创建两个视图:
- Sign in as user with data_engineer role. Then... CREATE SCHEMA syndata_db.sch; CREATE OR REPLACE VIEW syndata_db.sch.TPC_ORDERS_5K as ( SELECT * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS LIMIT 5000 ); CREATE OR REPLACE VIEW syndata_db.sch.TPC_CUSTOMERS_5K as ( SELECT * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER LIMIT 5000 );
查询输入表以查看数据,并确认每个表是否都有 5,000 行:
USE WAREHOUSE syndata_wh; SELECT TOP 20 * FROM syndata_db.sch.TPC_ORDERS_5K; SELECT COUNT(*) FROM syndata_db.sch.TPC_ORDERS_5K; select count(distinct o_clerk), count(*) from syndata_db.sch.TPC_ORDERS_5K; SELECT TOP 20 * FROM syndata_db.sch.TPC_CUSTOMERS_5K; SELECT COUNT(*) FROM syndata_db.sch.TPC_CUSTOMERS_5K;
调用 GENERATE_SYNTHETIC_DATA 存储过程将合成数据生成到两个输出表中。指定联接键,因为您稍后将基于这些键进行联接。
CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({ 'datasets':[ { 'input_table': 'syndata_db.sch.TPC_ORDERS_5K', 'output_table': 'syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC', 'columns': {'O_CUSTKEY': {'join_key': True}} }, { 'input_table': 'syndata_db.sch.TPC_CUSTOMERS_5K', 'output_table': 'syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC', 'columns' : {'C_CUSTKEY': {'join_key': True}} } ], 'replace_output_tables':True });
查询输出表以查看合成数据:
SELECT TOP 20 * FROM syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC; SELECT COUNT(*) FROM syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC; SELECT TOP 20 * FROM syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC; SELECT COUNT(*) FROM syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC;
清理所有对象
USE ROLE ACCOUNTADMIN; DROP DATABASE syndata_db; DROP ROLE data_engineer; DROP WAREHOUSE syndata_wh;