对于 Unity Catalog 管理的数据,路径是如何工作的?

本文介绍 Unity Catalog 中路径重叠方面的限制,详细介绍 Unity Catalog 对象中数据文件基于路径的访问模式,还介绍了 Unity Catalog 如何管理表和卷的路径。

注意

仅在 Databricks Runtime 13.3 LTS 及更高版本上支持卷。 在 Databricks Runtime 12.2 LTS 及更低版本中,针对 /Volumes 路径的操作可能会成功,但可以将数据写入附加到计算群集的临时存储磁盘,而不是按预期将数据保存到 Unity Catalog 卷。

Unity Catalog 对象的路径不能重叠

Unity Catalog 通过防止数据托管目录重叠来强制实施数据治理。 Unity Catalog 强制实施以下规则:

  • 外部位置不能与其他外部位置重叠。
  • 表和卷将数据文件存储在外部位置或元存储根位置。
  • 卷不能与其他卷重叠。
  • 表不能与其他表重叠。
  • 表和卷不能相互重叠。
  • 托管存储位置不能相互重叠。 请参阅在 Unity Catalog 中指定托管存储位置
  • 外部卷不能重叠托管存储位置。
  • 外部表不能重叠托管存储位置。

这些规则意味着 Unity Catalog 中存在以下限制:

  • 不能在外部位置中定义另一个外部位置。
  • 不能在卷中定义另一个卷。
  • 不能在表中定义另一个表。
  • 不能在卷中的任何数据文件或目录上定义表。
  • 不能在表中的目录上定义卷。

注意

始终可使用基于路径的访问从卷(包括 Delta Lake)写入或读取数据文件。 不能将数据文件注册为 Unity Catalog 元存储中的表。

Unity Catalog 完全管理托管表和托管卷的路径

创建托管表或托管卷时,Unity Catalog 会在与包含架构相关联的 Unity Catalog 配置的存储位置中创建一个新目录。 此目录的名称是随机生成的,以避免与现有其他目录发生任何潜在的冲突。

此行为不同于 Hive 元存储创建托管表的方式。 Databricks 建议始终使用表名与 Unity Catalog 托管表交互,使用卷路径与 Unity Catalog 托管卷进行交互。

外部表和外部卷的路径由 Unity Catalog 控制

创建外部表或外部卷时,需要指定由 Unity Catalog 管理的外部位置内的路径。

重要

Databricks 建议永远不要在外部位置的根目录中创建外部卷或外部表。 相反,请在外部位置的子目录中创建外部卷和外部表。 这些建议应该会有助于避免路径意外重叠。 请参阅 Unity Catalog 对象的路径不能重叠

为了方便使用,Databricks 建议使用表名与 Unity Catalog 外部表交互,使用卷路径与 Unity Catalog 外部卷进行交互。

或者,对相应的 Unity Catalog 对象具有足够特权的用户可以使用完全限定的云对象存储路径从外部表或外部卷访问数据。

重要

Unity Catalog 管理使用云 URI 访问与外部表或外部卷关联的数据的所有权限。 这些权限将替代与外部位置关联的任何权限。 请参阅 Unity Catalog 权限和安全对象

如何访问 Unity Catalog 中的数据?

Unity Catalog 对象通过对象标识符、卷路径或云 URI 提供对数据的访问。 可以使用这些值访问与卷和表关联的数据。

可使用具有以下模式的三层标识符来访问 Unity Catalog 表:

<catalog_name>.<schema_name>.<table_name>

什么是 Unity Catalog 中的卷文件路径?

卷提供一个文件路径,用于访问具有以下模式的数据文件:

/Volumes/<catalog_name>/<schema_name>/<volume_name>/<path_to_file>

云 URI 要求用户提供驱动程序、存储容器标识符和目标文件的完整路径,如以下示例所示:

abfss://<container_name>@<storage_account>.dfs.core.chinacloudapi.cn/<path>

下表显示了 Unity Catalog 对象允许的访问方法:

对象 对象标识符 文件路径 云 URI
外部位置
托管表
外部表
托管卷
外部卷

注意

Unity Catalog 卷使用具有以下模式的三层对象标识符来管理命令(例如 CREATE VOLUMEDROP VOLUME):

<catalog_name>.<schema_name>.<volume_name>

若要实际使用卷中的文件,必须使用基于路径的访问。