在 OneLake 中将 Snowflake 与 Iceberg 表配合使用

Microsoft OneLake 可与 Snowflake 一起使用,以便存储和访问 Apache Iceberg 表。

按照本指南在 Azure 上使用 Snowflake 来:

  • 将 Iceberg 表直接写入 OneLake
  • 读取从 Delta Lake 格式转换的虚拟 Iceberg 表

Important

此功能目前为预览版

在开始之前,请遵循下面所示的先决条件步骤。

Prerequisite

若要在 Azure 上使用 Snowflake 通过 OneLake 编写或读取 Iceberg 表,您的 Snowflake 帐户在 Entra ID 中的身份需要具备与 Fabric 通信的权限。 启用允许服务主体 调用 Fabric API调用 OneLake API 的 Fabric 租户级设置。

在 Azure 上使用 Snowflake 将 Iceberg 表写入 OneLake

如果在 Azure 上使用 Snowflake,可以按照以下步骤将 Iceberg 表写入 OneLake:

  1. 确保 Fabric 容量与 Snowflake 实例位于同一 Azure 位置。

    找到与 Fabric Lakehouse 关联的 Fabric 容量的位置。 打开包含 Lakehouse 的 Fabric 工作区的设置。

    显示 Fabric 容量区域的屏幕截图。

    在 Azure 帐户界面上的 Snowflake 左下角,检查 Snowflake 帐户的 Azure 区域。

    显示 Snowflake 帐户区域的屏幕截图。

    如果这些区域不同,则需要在与 Snowflake 帐户相同的区域使用不同的 Fabric 容量。

  2. 打开 Lakehouse 的“文件”区域的菜单,选择“属性”,然后复制该文件夹的 URL(HTTPS 路径)。

    显示“属性”菜单项的屏幕截图。

  3. 找到 Fabric 租户 ID。 选择 Fabric 用户界面右上角的用户配置文件,然后将鼠标悬停在“租户名称”旁边的信息气泡上。 复制租户 ID

    显示租户 ID 的屏幕截图。

  4. 在 Snowflake 中,使用您 lakehouse 中的文件夹路径 EXTERNAL VOLUME 来设置 Files可在此处找到有关设置 Snowflake 外部卷的详细信息。

    Note

    Snowflake 需要 URL 方案为azure://,因此请务必将路径从https://更改为azure://

    CREATE OR REPLACE EXTERNAL VOLUME onelake_write_exvol
    STORAGE_LOCATIONS =
    (
        (
            NAME = 'onelake_write_exvol'
            STORAGE_PROVIDER = 'AZURE'
            STORAGE_BASE_URL = 'azure://<path_to_lakehouse>/Files/icebergtables'
            AZURE_TENANT_ID = '<Tenant_ID>'
        )
    );
    

    在此示例中,使用此外部卷创建的任何表都存储在 Fabric Lakehouse 的 Files/icebergtables 文件夹中。

  5. 创建外部卷后,运行以下命令以检索 Snowflake 用于写入 OneLake 的应用程序的同意 URL 和名称。 Snowflake 帐户中的任何其他外部卷均可使用此应用程序。

    DESC EXTERNAL VOLUME onelake_write_exvol;
    

    此命令的输出返回 AZURE_CONSENT_URLAZURE_MULTI_TENANT_APP_NAME 属性。 记下这两个值。 Azure 多租户应用名称类似于 <name>_<number>,但只需捕获 <name> 部分。

  6. 如果之前尚未执行此作,请在新的浏览器选项卡中打开上一步中的同意 URL。 如果想要继续,请同意所需的应用程序权限(如果出现提示)。 你可能会重定向到主要的 Snowflake 网站。

  7. 返回 Fabric,打开工作区并选择“管理访问权限”,然后选择“添加人员或组”。 向 Snowflake 外部卷使用的应用程序授予将数据写入工作区中的 Lakehouse 所需的权限。 我们建议授予“参与者”角色

  8. 返回 Snowflake,使用新的外部卷创建 Iceberg 表。

    CREATE OR REPLACE ICEBERG TABLE MYDATABASE.PUBLIC.Inventory (
        InventoryId int,
        ItemName STRING
    )
    EXTERNAL_VOLUME = 'onelake_write_exvol'
    CATALOG = 'SNOWFLAKE'
    BASE_LOCATION = 'Inventory/';
    

    运行此语句后,已在外部卷中定义的文件夹路径中创建名为 Inventory 的新 Iceberg 表文件夹。

  9. 向 Iceberg 表添加一些数据。

    INSERT INTO MYDATABASE.PUBLIC.Inventory
    VALUES
    (123456,'Amatriciana');
    
  10. 最后,在同一个 Lakehouse 的“表格”区域,可以为 Iceberg 表创建一个 OneLake 快捷方式。 通过该快捷方式,Iceberg 表将显示为 Delta Lake 表,以供 Fabric 工作负荷使用。

在 Azure 上使用 Snowflake 从 OneLake 读取虚拟 Iceberg 表

若要在 Azure 平台上使用 Snowflake 来读取基于 Fabric 中 Delta Lake 表的虚拟 Iceberg 表,请按以下步骤操作。

  1. 按照 指南确认 Delta Lake 表已成功转换为 Iceberg,并记录下包含该表的数据项路径,以及该表的最新 *.metadata.json 文件。

  2. 找到 Fabric 租户 ID。 选择 Fabric 用户界面右上角的用户配置文件,然后将鼠标悬停在“租户名称”旁边的信息气泡上。 复制租户 ID

    显示租户 ID 的屏幕截图。

  3. 在 Snowflake 中,使用包含表的数据项的EXTERNAL VOLUME文件夹路径来设置Tables可在此处找到有关设置 Snowflake 外部卷的详细信息。

    CREATE OR REPLACE EXTERNAL VOLUME onelake_read_exvol
    STORAGE_LOCATIONS =
    (
        (
            NAME = 'onelake_read_exvol'
            STORAGE_PROVIDER = 'AZURE'
            STORAGE_BASE_URL = 'azure://<path_to_data_item>/Tables/'
            AZURE_TENANT_ID = '<Tenant_ID>'
        )
    )
    ALLOW_WRITES = false;
    

    Note

    Snowflake 要求 URL 方案为 azure://,因此请务必将 https:// 更改为 azure://

    <path_to_data_item>替换为数据项的路径,例如https://onelake.dfs.fabric.microsoft.com/83896315-c5ba-4777-8d1c-e4ab3a7016bc/a95f62fa-2826-49f8-b561-a163ba537828

  4. 创建外部卷后,运行以下命令以检索 Snowflake 用于写入 OneLake 的应用程序的同意 URL 和名称。 Snowflake 帐户中的任何其他外部卷均可使用此应用程序。

    DESC EXTERNAL VOLUME onelake_read_exvol;
    

    此命令的输出返回 AZURE_CONSENT_URLAZURE_MULTI_TENANT_APP_NAME 属性。 记下这两个值。 Azure 多租户应用名称类似于 <name>_<number>,但只需捕获 <name> 部分。

  5. 如果之前尚未执行此作,请在新的浏览器选项卡中打开上一步中的同意 URL。 如果想要继续,请同意所需的应用程序权限(如果出现提示)。 你可能会重定向到主要的 Snowflake 网站。

  6. 返回 Fabric,打开工作区并选择“管理访问权限”,然后选择“添加人员或组”。 向 Snowflake 外部卷使用的应用程序授予必要权限,以便能够读取您工作区内数据项的数据。

    Tip

    如果需要,可以选择在数据项级别授予权限。 详细了解 OneLake 数据访问。

  7. 如果尚未在 Snowflake 中创建 CATALOG INTEGRATION 对象,请现在执行此操作。 Snowflake 需要此来以引用存储中的现有 Iceberg 表。

    CREATE CATALOG INTEGRATION onelake_catalog_integration
    CATALOG_SOURCE = OBJECT_STORE
    TABLE_FORMAT = ICEBERG
    ENABLED = TRUE;
    
  8. 现在返回 Snowflake,创建一个 Iceberg 表,引用 OneLake 中虚拟化 Iceberg 表的最新元数据文件。

    CREATE OR REPLACE ICEBERG TABLE MYDATABASE.PUBLIC.<TABLE_NAME>
    EXTERNAL_VOLUME = 'onelake_read_exvol'
    CATALOG = onelake_catalog_integration
    METADATA_FILE_PATH = '<metadata_file_path>';
    

    Note

    将 `<TABLE_NAME>` 替换为您的表名,然后将 `<metadata_file_path>` 替换为 Iceberg 表的元数据文件路径,例如 `dbo/MyTable/metadata/321.metadata.json`。

    运行此语句后,现在有了对虚拟化 Iceberg 表的引用,现在可以使用 Snowflake 进行查询。

  9. 通过运行以下语句查询虚拟化的 Iceberg 表。

    SELECT TOP 10 * FROM MYDATABASE.PUBLIC.<TABLE_NAME>;
    

Troubleshooting

请参阅 OneLake 表格式虚拟化文档的 故障排除限制和注意事项 部分,以及 Delta Lake 和 Apache Iceberg 表格式之间的转换。