将 Iceberg 表与 OneLake 配合使用

在 Microsoft OneLake 中,可以无缝处理 Delta Lake 和 Apache Iceberg 格式的表。

这种灵活性是通过 元数据虚拟化实现的,该功能允许 Iceberg 表解释为 Delta Lake 表,反之亦然。 可以直接编写 Iceberg 表或创建这些表的快捷方式,使这些表可在各种 Fabric 工作负载中访问。 同样,可以使用 Iceberg 读取器读取以 Delta Lake 格式编写的 Fabric 表。

在编写或创建 Iceberg 表文件夹的快捷方式时,OneLake 会自动生成表的虚拟 Delta Lake 元数据(Delta 日志),使其能够与 Fabric 工作负载一起使用。 Delta Lake 表现在包含 Iceberg 的虚拟元数据,从而能够与 Iceberg 解析器兼容。

重要

此功能目前为预览版

显示从 Iceberg 到 Delta Lake 的表虚拟化的关系图。

虽然本文包含有关将 Iceberg 表与 Snowflake 配合使用的指导,但此功能旨在与存储中的 Parquet 格式数据文件的任何 Iceberg 表一起使用。

将 Delta Lake 表虚拟化为 Iceberg

若要设置从 Delta Lake 格式到 Iceberg 格式的表的自动转换和虚拟化,请执行以下步骤。

  1. 在工作区设置中,通过启用名为 “启用 Delta Lake 表到 Apache Iceberg 表格式自动虚拟化” 的委托 OneLake 设置,实现 Delta Lake 表到 Iceberg 格式的自动表虚拟化。

    注意

    此设置控制当前处于预览状态的功能。 当为所有用户启用该功能且不再处于预览状态时,将在将来的更新中删除此设置。

  2. 请确保你的 Delta Lake 表或它的快捷方式位于数据项的 Tables 部分。 数据项可以是 Lakehouse 或其他 Fabric 数据项。

    小窍门

    如果 Lakehouse 启用架构功能,则表文件夹将直接位于架构中,例如 dbo。 如果 Lakehouse 未启用架构,则表目录将直接在 Tables 目录中。

  3. 确认 Delta Lake 表已成功转换为虚拟 Iceberg 格式。 可以通过查看表后面的目录来完成此操作。

    若要在 Lakehouse 中查看目录,可以在 Fabric UI 中右键单击该表,然后选择“ 查看文件”。

    如果表位于其他数据类型(例如仓库、数据库或镜像数据库)中,则需要使用 Azure 存储资源管理器或 OneLake 文件资源管理器等客户端(而不是 Fabric UI)查看表后面的文件。

  4. 应会看到表文件夹内命名 metadata 的目录,并且它应包含多个文件,包括转换日志文件。 打开转换日志文件以查看有关 Delta Lake 到 Iceberg 转换的详细信息,包括最近转换的时间戳和任何错误详细信息。

  5. 如果转换日志文件显示表已成功转换,请使用所选服务、应用或库读取 Iceberg 表。

    根据你使用的 Iceberg 表读取器,你需要知道表目录的路径,或者 metadata 目录中显示的最新 .metadata.json 文件路径。

    可以通过打开版本号最高的文件的 “属性” 视图 *.metadata.json ,查看表的最新元数据文件的 HTTP 路径。 记下此路径。

    数据项 Tables 文件夹的路径可能如下所示:

    https://onelake.dfs.fabric.microsoft.com/83896315-c5ba-4777-8d1c-e4ab3a7016bc/a95f62fa-2826-49f8-b561-a163ba537828/Tables/
    

    在该文件夹中,最新元数据文件的相对路径可能如下所示 dbo/MyTable/metadata/321.metadata.json

    若要使用 Snowflake 读取虚拟 Iceberg 表,请按照本指南中的步骤进行

创建 Iceberg 表的表快捷方式

如果在 OneLake 快捷方式支持的存储位置中已有 Iceberg 表,请按照以下步骤创建快捷方式并让 Iceberg 表以 Delta Lake 格式显示。

  1. 找到 Iceberg 表。 查找 Iceberg 表的存储位置,该表可以存储在 Azure Data Lake Storage、OneLake、Amazon S3、Google Cloud Storage 或 S3 兼容的存储服务中。

    注意

    如果你使用的是 Snowflake 并且不确定 Iceberg 表的存储位置,则可以运行以下语句以查看 Iceberg 表的存储位置。

    SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('<table_name>');

    运行此语句将返回 Iceberg 表的元数据文件的路径。 此路径指示哪个存储帐户包含 Iceberg 表。 例如,以下是查找存储在 Azure Data Lake Storage 中的 Iceberg 表的路径的相关信息:

    {"metadataLocation":"azure://<storage_account_path>/<path_within_storage>/<table_name>/metadata/00001-389700a2-977f-47a2-9f5f-7fd80a0d41b2.metadata.json","status":"success"}

    Iceberg 表文件夹需要包含一个 metadata 文件夹,其中至少包含一个以 .metadata.json 结尾的文件。

  2. 在 Fabric Lakehouse 中,在 Lakehouse 的“表”区域中创建新的表快捷方式。

    小窍门

    如果在您的数据湖屋的 Tables 文件夹下看到例如 dbo 等架构,则表示该数据湖屋已启用架构功能。 在这种情况下,右键单击架构,并在架构下创建表快捷方式。

    显示新快捷操作的屏幕截图。

  3. 对于快捷方式的目标路径,请选择 Iceberg 表文件夹。 Iceberg 表文件夹包含 metadatadata 文件夹。

  4. 创建快捷方式后,应会自动看到此表反映为 Lakehouse 中的 Delta Lake 表,可供在整个 Fabric 中使用。

    显示已创建的快捷方式的屏幕截图。

    如果新的 Iceberg 表快捷方式未显示为可用表,请查看故障排除部分。

故障排除

以下提示可帮助确保 Iceberg 表与此功能兼容:

检查 Iceberg 表的文件夹结构

在首选的存储资源管理器工具中打开 Iceberg 文件夹,并查看 Iceberg 文件夹在其原始位置的目录列表。 应看到类似于以下示例的文件夹结构。

../
|-- MyIcebergTable123/
    |-- data/
        |-- A5WYPKGO_2o_APgwTeNOAxg_0_1_002.parquet
        |-- A5WYPKGO_2o_AAIBON_h9Rc_0_1_003.parquet
    |-- metadata/
        |-- 00000-1bdf7d4c-dc90-488e-9dd9-2e44de30a465.metadata.json
        |-- 00001-08bf3227-b5d2-40e2-a8c7-2934ea97e6da.metadata.json
        |-- 00002-0f6303de-382e-4ebc-b9ed-6195bd0fb0e7.metadata.json
        |-- 1730313479898000000-Kws8nlgCX2QxoDHYHm4uMQ.avro
        |-- 1730313479898000000-OdsKRrRogW_PVK9njHIqAA.avro
        |-- snap-1730313479898000000-9029d7a2-b3cc-46af-96c1-ac92356e93e9.avro
        |-- snap-1730313479898000000-913546ba-bb04-4c8e-81be-342b0cbc5b50.avro

如果未看到元数据文件夹,或者未看到本示例中显示的具有扩展名的文件,则可能没有正确生成的 Iceberg 表。

检查转换日志

将 Iceberg 表虚拟化为 Delta Lake 表时,可以在快捷方式文件夹内找到一个名为 _delta_log/ 的文件夹。 此文件夹包含转换成功后的 Delta Lake 格式的元数据(Delta 日志)。

此文件夹还包含 latest_conversion_log.txt 文件,其中包含最新尝试转换的成功或失败详细信息。

若要在创建快捷方式后查看此文件的内容,请在 Lakehouse 的“表格”区域下打开 Iceberg 表快捷方式菜单,然后选择“查看文件”

“查看文件”菜单项的屏幕截图。

应看到类似于以下示例的结构:

Tables/
|-- MyIcebergTable123/
    |-- data/
        |-- <data files>
    |-- metadata/
        |-- <metadata files>
    |-- _delta_log/   <-- Virtual folder. This folder doesn't exist in the original location.
        |-- 00000000000000000000.json
        |-- latest_conversion_log.txt   <-- Conversion log with latest success/failure details.

打开转换日志文件以查看最新的转换时间或失败详细信息。 如果未看到转换日志文件,则表示未尝试转换

如果未尝试转换

如果未看到转换日志文件,则表示未尝试转换。 以下是未尝试转换的两个常见原因:

  • 快捷方式未在正确的位置创建。

    为了将 Iceberg 表的快捷方式转换为 Delta Lake 格式,必须将快捷方式直接放在未启用架构的 Lakehouse 的“表”文件夹下。 如果希望表自动虚拟化为 Delta Lake 表,则不应将快捷方式放在“文件”部分或另一个文件夹下。

    显示“表”文件夹中快捷方式的正确位置的屏幕截图。

  • 快捷方式的目标路径不是 Iceberg 文件夹路径。

    创建快捷方式时,在目标存储位置中选择的文件夹路径必须是 Iceberg 表文件夹。 此文件夹包含 metadata 文件夹data

    显示快捷方式创建过程中快捷目标路径的内容的屏幕截图。

Snowflake 中的“无法验证构造容量区域”错误消息

如果使用 Snowflake 将新的 Iceberg 表写入 OneLake,可能会看到以下错误消息:

无法验证构造容量区域。 原因:“访问令牌无效。 这可能是由于身份验证和范围定义。 请验证委托的范围。

如果看到此错误,请让 Fabric 租户管理员仔细检查在使用 Snowflake 将 Iceberg 表写入 OneLake部分中提到的两个租户设置是否都已启用。

  1. 在 Fabric UI 的右上角,打开 “设置”,然后选择 “管理门户”。
  2. “租户设置”部分的 “开发人员设置” 部分中,启用标记为 “服务主体可以使用 Fabric API”的设置
  3. 在同一区域,在 OneLake 设置 部分中,启用标记为 “用户”的设置可以访问 OneLake 中存储的数据以及 Fabric 外部的应用

限制和注意事项

使用此功能时,请记住以下临时限制:

  • 支持的数据类型

    以下 Iceberg 列数据类型使用此功能映射到其相应的 Delta Lake 类型。

    Iceberg 列类型 Delta Lake 列类型 注释
    int integer
    long long 请参阅“类型宽度问题”
    float float
    double double 请参阅“类型宽度问题”
    decimal(P, S) decimal(P, S) 请参阅“类型宽度问题”
    boolean boolean
    date date
    timestamp timestamp_ntz timestamp Iceberg 数据类型不包含时区信息。 Fabric 工作负荷不完全支持 timestamp_ntz Delta Lake 类型。 建议将时间戳与包含的时区结合使用。
    timestamptz timestamp 在 Snowflake 中,若要使用此类型,请在 Iceberg 表创建过程中将 timestamp_ltz 指定为列类型。 可在此处找到有关 Snowflake 支持的 Iceberg 数据类型的详细信息
    string string
    binary binary
    time 不支持
  • 类型宽度问题

    如果使用 Snowflake 编写 Iceberg 表,并且该表包含列类型 INT64doubleDecimal,精度 > = 10,则生成的虚拟 Delta Lake 表可能并非可供所有 Fabric 引擎使用。 可能会看到以下错误:

    Parquet column cannot be converted in file ... Column: [ColumnA], Expected: decimal(18,4), Found: INT32.
    

    我们正在设法解决此问题。

    解决方法:如果使用 Lakehouse 表预览用户界面并看到此问题,可以通过切换到 SQL 终结点视图(右上角,选择 Lakehouse 视图,切换到 SQL 终结点)并在此处预览表来解决此错误。 如果随后切换回 Lakehouse 视图,则表预览应正确显示。

    如果正在运行 Spark 笔记本或作业并遇到此问题,可以通过将 spark.sql.parquet.enableVectorizedReader Spark 配置设置为 false 来解决此错误。 以下是在 Spark 笔记本中运行的 PySpark 命令示例:

    spark.conf.set("spark.sql.parquet.enableVectorizedReader","false")
    
  • Iceberg 表元数据存储不可移植

    Iceberg 表的元数据文件使用绝对路径引用来相互引用。 如果将 Iceberg 表的文件夹内容复制或移动到其他位置而不重写 Iceberg 元数据文件,则 Iceberg 读取器(包括此 OneLake 功能)将无法读取该表。

    解决方法:

    如果需要将 Iceberg 表移动到其他位置来使用此功能,请使用最初编写 Iceberg 表的工具在所需位置编写新的 Iceberg 表。

  • Iceberg 表文件夹必须仅包含一组元数据文件

    如果在 Snowflake 中删除并重新创建 Iceberg 表,则不会清理元数据文件。 这个行为是特意设计用来支持 Snowflake 中的 UNDROP 功能。 但是,由于快捷方式直接指向某个文件夹,并且该文件夹现在包含多个元数据文件集,因此在删除旧表的元数据文件之前,我们无法转换该表。

    如果在 Iceberg 表的元数据文件夹中找到多个元数据文件集,转换将失败。

    解决方法:

    为了确保转换后的表反映表的正确版本,请执行以下操作:

    • 确保不要在同一文件夹中存储多个 Iceberg 表。
    • 在重新创建表之前,在删除 Iceberg 表文件夹后清理其任何内容。
  • 元数据更改不会立即反映

    如果对 Iceberg 表进行元数据更改(例如添加列、删除列、重命名列或更改列类型),则在进行数据更改(例如添加一行数据)之前,可能无法重新转换该表。

    我们正在努力修复此问题,以便获取包含最新元数据更改的正确的最新元数据文件。

    解决方法:

    对 Iceberg 表进行架构更改后,添加一行数据或对数据进行任何其他更改。 完成更改后,应该能够刷新并查看 Fabric 中表的最新视图。

  • 区域可用性限制

    此功能在以下区域中尚不可用:

    • 卡塔尔中部
    • 挪威西部

    解决方法:

    附加到其他区域中 Fabric 容量的工作区可以使用此功能。 查看可使用 Microsoft Fabric 的区域的完整列表。

  • 不支持专用链接

    已启用专用链接的租户或工作区当前不支持此功能。

    我们正在努力改进以消除此限制。

  • OneLake 快捷方式必须位于同一区域

    我们暂时限制了使用指向 OneLake 位置的快捷方式来使用此功能:快捷方式的目标位置必须与快捷方式本身位于同一区域。

    我们正在努力改进以消除此要求。

    解决方法:

    如果你有指向另一个 Lakehouse 中的 Iceberg 表的 OneLake 快捷方式,请确保另一个 Lakehouse 与同一区域的容量相关联。

  • 不支持某些 Iceberg 分区转换类型

    目前,Iceberg 分区类型bucket[N]truncate[W]不受支持。

    如果要转换的 Iceberg 表包含这些分区转换类型,则虚拟化到 Delta Lake 格式不会成功。

    我们正在努力改进以消除此限制。