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:
确保 Fabric 容量与 Snowflake 实例位于同一 Azure 位置。
找到与 Fabric Lakehouse 关联的 Fabric 容量的位置。 打开包含 Lakehouse 的 Fabric 工作区的设置。
在 Azure 帐户界面上的 Snowflake 左下角,检查 Snowflake 帐户的 Azure 区域。
如果这些区域不同,则需要在与 Snowflake 帐户相同的区域使用不同的 Fabric 容量。
打开 Lakehouse 的“文件”区域的菜单,选择“属性”,然后复制该文件夹的 URL(HTTPS 路径)。
找到 Fabric 租户 ID。 选择 Fabric 用户界面右上角的用户配置文件,然后将鼠标悬停在“租户名称”旁边的信息气泡上。 复制租户 ID。
在 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文件夹中。创建外部卷后,运行以下命令以检索 Snowflake 用于写入 OneLake 的应用程序的同意 URL 和名称。 Snowflake 帐户中的任何其他外部卷均可使用此应用程序。
DESC EXTERNAL VOLUME onelake_write_exvol;此命令的输出返回
AZURE_CONSENT_URL和AZURE_MULTI_TENANT_APP_NAME属性。 记下这两个值。 Azure 多租户应用名称类似于<name>_<number>,但只需捕获<name>部分。如果之前尚未执行此作,请在新的浏览器选项卡中打开上一步中的同意 URL。 如果想要继续,请同意所需的应用程序权限(如果出现提示)。 你可能会重定向到主要的 Snowflake 网站。
返回 Fabric,打开工作区并选择“管理访问权限”,然后选择“添加人员或组”。 向 Snowflake 外部卷使用的应用程序授予将数据写入工作区中的 Lakehouse 所需的权限。 我们建议授予“参与者”角色。
返回 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 表文件夹。
向 Iceberg 表添加一些数据。
INSERT INTO MYDATABASE.PUBLIC.Inventory VALUES (123456,'Amatriciana');最后,在同一个 Lakehouse 的“表格”区域,可以为 Iceberg 表创建一个 OneLake 快捷方式。 通过该快捷方式,Iceberg 表将显示为 Delta Lake 表,以供 Fabric 工作负荷使用。
在 Azure 上使用 Snowflake 从 OneLake 读取虚拟 Iceberg 表
若要在 Azure 平台上使用 Snowflake 来读取基于 Fabric 中 Delta Lake 表的虚拟 Iceberg 表,请按以下步骤操作。
按照 指南确认 Delta Lake 表已成功转换为 Iceberg,并记录下包含该表的数据项路径,以及该表的最新
*.metadata.json文件。找到 Fabric 租户 ID。 选择 Fabric 用户界面右上角的用户配置文件,然后将鼠标悬停在“租户名称”旁边的信息气泡上。 复制租户 ID。
在 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。创建外部卷后,运行以下命令以检索 Snowflake 用于写入 OneLake 的应用程序的同意 URL 和名称。 Snowflake 帐户中的任何其他外部卷均可使用此应用程序。
DESC EXTERNAL VOLUME onelake_read_exvol;此命令的输出返回
AZURE_CONSENT_URL和AZURE_MULTI_TENANT_APP_NAME属性。 记下这两个值。 Azure 多租户应用名称类似于<name>_<number>,但只需捕获<name>部分。如果之前尚未执行此作,请在新的浏览器选项卡中打开上一步中的同意 URL。 如果想要继续,请同意所需的应用程序权限(如果出现提示)。 你可能会重定向到主要的 Snowflake 网站。
返回 Fabric,打开工作区并选择“管理访问权限”,然后选择“添加人员或组”。 向 Snowflake 外部卷使用的应用程序授予必要权限,以便能够读取您工作区内数据项的数据。
Tip
如果需要,可以选择在数据项级别授予权限。 详细了解 OneLake 数据访问。
如果尚未在 Snowflake 中创建
CATALOG INTEGRATION对象,请现在执行此操作。 Snowflake 需要此来以引用存储中的现有 Iceberg 表。CREATE CATALOG INTEGRATION onelake_catalog_integration CATALOG_SOURCE = OBJECT_STORE TABLE_FORMAT = ICEBERG ENABLED = TRUE;现在返回 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 进行查询。
通过运行以下语句查询虚拟化的 Iceberg 表。
SELECT TOP 10 * FROM MYDATABASE.PUBLIC.<TABLE_NAME>;
Troubleshooting
请参阅 OneLake 表格式虚拟化文档的 故障排除 和 限制和注意事项 部分,以及 Delta Lake 和 Apache Iceberg 表格式之间的转换。