在 Snowflake 中使用合成数据

此预览版介绍了一种用于生成合成数据的新存储过程,GENERATE_SYNTHETIC_DATA

概述

合成数据是通过程序生成的数据,用作真实数据的替代品。您可以使用合成数据来表示敏感、机密或其他受限的数据。合成数据集具有其所代表的数据集的特征,例如列数、列名、每列的数据类型以及为每列合成的数据值。数据工程师可以使用合成数据来测试和验证 Snowflake 中的工作负载,特别是当原始数据为敏感数据且不应受到未经授权的用户访问时。

在 Snowflake 中,您可以调用 SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA 存储过程,从多达五个输入表生成合成数据。指定一个输出表来存储合成数据。Snowflake 自动创建并授予调用存储过程的角色对输出表的访问权限。如果您需要再次生成输出表,可以通过修改存储过程参数来覆盖现有输出表。

优势

统计一致性:

表示原始数据集统计特性的数据集可以帮助数据工程师了解真实数据集的统计特性。随后,数据工程师可以测试和验证基于真实数据集的解决方案。

生产验证:

与生产数据集相似的合成数据集让生产工程师能够测试和验证其生产环境。从而让生产环境更加强大。

筛选合成数据

调用 GENERATE_SYNTHETIC_DATA 存储过程时,您可以选择性地设置 'privacy_filter': True 配置选项,以对输出表应用隐私过滤器。隐私过滤器会从输出表中删除与输入数据集过于相似的行。隐私阈值使用最近邻距离比 (NNDR) 和到最近记录的距离 (DCR) 值来确定是否应从输出表中删除一行。

关于合成数据算法

Snowflake 使用算法生成与原始数据集相似的合成数据。该算法使用原始数据集生成与原始数据集具有相同统计特性的合成数据。该算法利用联结函数捕捉数据在列内和列间的分布。捕获分布后,合成数据将在统计上具有类似于原始数据的特征,但与原始数据中的任何行之间没有直接的引用或链接。

如果您有多个输入表,可以指定连接键,即输入表中的列。该算法收集输入表中的指定连接键,将其转换为整型,重新转换回其原始格式,然后将其重新附加到合成表中。

要求

输入表格要求

要生成合成数据,您指定的每个输入表必须满足以下要求:

  • 表和视图。

  • 至少 20 行不同的内容。

  • 输入表中的列可以具有以下数据类型。具有不支持数据类型的列,该列的所有值均返回 null:

    • 所有数字类型(NUMBER、DECIMAL、FLOAT、INTEGER 等)

    • BOOLEAN

    • 所有日期和时间类型(DATE、DATETIME、TIME、TIMESTAMP 等),除了 TIMESTAMP_TZ

    • STRING、VARCHAR、CHAR、CHARACTER、TEXT

      如果 STRING 列中的值超过一半是唯一值,Snowflake 会因为隐私问题在输出表中用编辑后的值替换该值。

此外,请确保您的输入表格不超过以下限制:

  • 5 个输入表。

  • 每个输入表 100 列。

  • 230 万行

访问控制要求

要生成合成数据,您必须使用具有以下各项权限的角色:

  • 要用于查询的仓库的 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.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA 存储过程时,最多指定 5 个输入表。

  • 选择合适的输入表。有关更多信息,请参阅 要求 (本主题内容)。

示例:来自多个表的合成数据

此示例使用 Snowflake 示例数据数据库,该数据库已与几乎所有 Snowflake 客户共享。

按照以下步骤从多个输入表生成合成数据:

  1. 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;
    
    Copy
  2. 从 Snowflake 示例数据数据库创建视图:

    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
    );
    
    Copy
  3. 查询输入表以查看数据,并确认每个表是否都有 5000行:

    USE WAREHOUSE syndata_wh;
    SELECT * FROM syndata_db.sch.TPC_ORDERS_1K;
    
    Copy
  4. 调用 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_ORDERKEY': {'join_key': True}, '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
      });
    
    Copy
  5. 查询输出表以查看合成数据:

    SELECT * FROM syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC;
    
    Copy
语言: 中文