开放镜像登陆区域要求和格式

本文详细介绍了 Microsoft Fabric 中开放镜像的登陆区域和表/列操作要求。

重要

此功能目前为预览版

在 Fabric 工作区中通过 Fabric 门户或公共 API 创建开放镜像数据库后,可以在镜像数据库项“主页”上获取 OneLake 中的登陆区域 URL。 此登陆区域是应用程序以 Parquet 格式(未压缩、Snappy、GZIP、ZSTD)创建元数据文件和登陆数据的位置。

Fabric 门户中的屏幕截图,其中显示了镜像数据库项主页中的登陆区域 URL 位置。

登陆区域

对于每个镜像数据库,OneLake 中都有一个用于元数据和增量表的唯一存储位置。 开放镜像会为应用程序提供了一个登陆区域文件夹,用于创建元数据文件并将数据推送到 OneLake。 镜像将监视登陆区域中的这些文件,并读取文件夹中添加的新表和数据。

例如,如果要在登陆区域中创建表(Table ATable BTable C),请创建类似以下 URL 的文件夹:

  • https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored database id>/LandingZone/TableA
  • https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored database id>/LandingZone/TableB
  • https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored database id>/LandingZone/TableC

登陆区域中的元数据文件

每个表文件夹都必须包含一个 _metadata.json 文件。

此表元数据文件包含 JSON 记录,以便当前仅将唯一键列指定为 keyColumns

例如,将列 C1C2 声明为表的复合唯一键:

{
   "keyColumns" : ["C1", "C2"]
}

如果未指定 keyColumns_metadata.json,则无法更新/删除。 可以随时添加此文件,但添加后无法更改 keyColumns

登陆区域中的数据文件和格式

开放镜像支持 Parquet 作为登陆区域文件格式,可以压缩也可以不压缩。 支持的压缩格式包括 Snappy、GZIP 和 ZSTD。

写入登陆区域的所有 Parquet 文件具有以下格式:

<RowMarker><DataColumns>

  • RowMarker:列名是 __rowMarker__(包括 rowMarker 前后的两个下划线)。

    • RowMaker 值:
      • 对于 INSERT 为 0
      • 对于 UPDATE 为 1
      • 对于 DELETE 为 2
      • 对于 UPSERT 为 4
  • 行顺序:文件中的所有日志都应按事务中应用的自然顺序排列。 对于多次更新的同一行来说,这一点很重要。 开放镜像使用文件中的顺序应用更改。

  • 文件顺序:文件应该以单调递增的编号添加。

  • 文件名:文件名为 20 位数字,例如第一个文件为 00000000000000000001.parquet,第二个文件为 00000000000000000002.parquet。 文件名应以连续编号表示。 镜像服务会自动删除文件,但最后一个文件将保留,以便发布者系统可以参考该文件来按顺序添加下一个文件。

初始加载

若要将数据初始加载到开放镜像数据库中,所有行都应将 INSERT 作为行标记。 如果文件中没有 RowMarker 数据,镜像会将整个文件视为 INSERT。

增量更改

开放镜像会按顺序读取增量更改,并将其应用于目标 Delta 表。 顺序在更改日志和文件顺序中为隐式。

更新的行必须包含所有列的完整行数据。

以下是将 EmployeeID E0001 的 EmployeeLocation 从 Redmond 更改为 Bellevue 的行历史记录的一些示例 Parquet 数据。 在此应用场景中,EmployeeID 列已标记为登陆区域中的元数据文件中的键列。

__rowMarker__,EmployeeID,EmployeeLocation
0,E0001,Redmond
0,E0002,Redmond
0,E0003,Redmond
1,E0001,Bellevue

如果更新了键列,则应通过对之前的键列执行 DELETE 操作并使用新键和数据对行执行 INSERT 来呈现。 例如,将 EmployeeID E0001 的唯一标识符 RowMarker 更改为 E0002 的行历史记录。 无需为 DELETE 行提供所有列数据,只需提供键列。

__rowMarker__,EmployeeID,EmployeeLocation
0,E0001,Bellevue
2,E0001,NULL
0,E0002,Bellevue

表操作

开放镜像支持表操作,例如添加、删除和重命名表。

添加表

开放镜像会选取应用程序添加到登陆区域的任何表。 开放镜像在每次迭代中扫描新表。

删除表

开放镜像可跟踪文件夹名称。 如果删除了表文件夹,则开放镜像会删除镜像数据库中的表。

如果重新创建文件夹,则开放镜像会删除该表,并使用文件夹中的新数据重新创建该表,这是通过跟踪文件夹的 ETag 来实现的。

尝试删除表时,可以尝试删除该文件夹,但有可能开放镜像仍使用该文件夹中的数据,从而导致发布者删除失败。

重命名表

若要重命名表,请删除并重新创建包含初始数据和增量数据的文件夹。 需要将数据重新填充到重命名的表中。

架构

可以在架构文件夹中指定表路径。 架构登陆区域应具有文件夹名称 <schemaname>.schema。 可以有多个架构,并且架构中可以有多个表。

例如,如果要在登陆区域中创建架构(Schema1Schema2)和表(Table ATable BTable C),请在 OneLake 中创建类似以下路径的文件夹:

  • https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored database id>/LandingZone/Schema1.schema/TableA
  • https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored database id>/LandingZone/Schema1.schema/TableB
  • https://onelake.dfs.fabric.microsoft.com/<workspace id>/<mirrored database id>/LandingZone/Schema2.schema/TableC

表列和列操作

列类型

  • 登陆区域中支持简单 Parquet 类型。
  • 复杂类型应写为 JSON 字符串。
  • 二进制复杂类型(如地理、图像等)可以作为二进制类型存储在登陆区域中。

添加列

如果向 Parquet 文件添加新列,则开放镜像会将这些列添加到增量表。

删除列

如果从新日志文件中删除了列,则开放镜像会将这些列的 NULL 存储在新行中,而旧行会将这些列存储在数据中。 若要删除列,请删除表并在登陆区域中再次创建表文件夹,这将导致使用新架构和数据重新创建 Delta 表。

开放镜像始终会将先前版本的已添加数据中的所有列联合起来。 若要移除列,请重新创建表/文件夹。

更改列类型

若要更改列类型,请删除包含初始和增量数据的文件夹,然后使用新列类型重新创建。 提供新的列类型而不重新创建表会导致错误,该表的复制将停止。 重新创建表文件夹后,将使用新数据和架构恢复复制。

重命名列

若要重命名列,请删除表文件夹,并使用所有数据和新的列名重新创建该文件夹。

下一步