什么是 Unity Catalog 卷?

卷是支持对非表格数据集进行治理的 Unity Catalog 对象。 卷表示云对象存储位置的存储逻辑卷。 卷提供用于访问、存储、管理和组织文件的功能。

虽然表提供对表格数据集的治理,但卷增加了对非表格数据集的治理。 可以使用卷来存储和访问任何格式的文件,包括结构化、半结构化和非结构化数据。

Databricks 建议使用卷来控制对所有非表格数据的访问。 与表一样,卷可以是托管卷或外部卷。

重要

不能将卷用作表的位置。 卷仅用于基于路径的数据访问。 如果要在 Unity Catalog 中处理表格数据,请使用表。

以下文章详细介绍了如何使用卷:

注意

使用卷时,必须使用 SQL 仓库或运行 Databricks Runtime 13.3 LTS 或更高版本的群集,除非使用的是 Azure Databricks UI,例如目录资源管理器。

什么是托管表?

托管卷是在包含架构的托管存储位置中创建的 Unity Catalog 控制的存储卷。 请参阅在 Unity Catalog 中指定托管存储位置

托管卷允许创建受管理存储以处理文件,而无需外部位置和存储凭据的开销。 创建托管卷时无需指定位置,并且托管卷中数据的所有文件访问都通过 Unity Catalog 管理的路径进行。

什么是外部卷?

外部卷是使用 Unity Catalog 控制的存储凭据针对外部位置中的目录注册的 Unity Catalog 控制的存储卷。

Unity Catalog 不管理外部卷中文件的生命周期和布局。 删除外部表卷,Unity Catalog 不会删除基础数据。

使用哪个路径访问卷中的文件?

卷位于 Unity Catalog 三级命名空间的第三级别 (catalog.schema.volume):

Unity Catalog 对象模型图,侧重于卷

无论使用 Apache Spark、SQL、Python 还是其他语言和库,访问卷的路径都是相同的。 这与绑定到 Azure Databricks 工作区的对象存储中的文件的旧访问模式不同。

访问卷中的文件的路径使用以下格式:

/Volumes/<catalog>/<schema>/<volume>/<path>/<file-name>

使用 Apache Spark 时,Azure Databricks 还支持可选 dbfs:/ 方案,因此以下路径也有效:

dbfs:/Volumes/<catalog>/<schema>/<volume>/<path>/<file-name>

路径中的序列 /<catalog>/<schema>/<volume> 对应于与文件关联的三个 Unity Catalog 对象名称。 这些路径元素是只读的,用户不能直接写入,这意味着无法使用文件系统操作创建或删除这些目录。 它们会自动进行管理,并与相应的 Unity Catalog 实体保持同步。

注意

还可以使用云存储 URI 访问外部卷中的数据。

示例笔记本:创建和使用卷

以下笔记本演示了创建 Unity Catalog 卷并与之交互的基本 SQL 语法。

教程:Unity Catalog 卷笔记本

获取笔记本

卷的保留路径

卷引入了以下用于访问卷的保留路径:

  • dbfs:/Volumes
  • /Volumes

注意

路径也保留用于 Apache Spark API 和 dbutils(包括 /volumes/Volume/volume)中这些路径的潜在拼写错误,无论它们前面是否为 dbfs://dbfs/Volumes 路径也是保留的,但不能用于访问卷。

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

重要

如果预先存在的数据存储在 DBFS 根上的保留路径中,则可以提交支持票证以获取对此数据的临时访问权限,以将其移动到另一个位置。

限制

必须使用已启用 Unity Catalog 的计算来与 Unity Catalog 卷进行交互。 卷并非支持所有工作负载。

注意

卷不支持分发给执行程序的 dbutils.fs 命令。

适用以下限制:

在 Databricks Runtime 14.3 LTS 及更高版本中:

  • 在单用户用户群集上,无法在 Scala 中从线程和子进程访问卷。

在 Databricks Runtime 14.2 及更低版本中:

  • 在配置了共享访问模式的计算中,无法使用 UDF 访问卷。
    • Python 或 Scala 都有权从驱动程序访问 FUSE,但无权从执行程序访问 FUSE。
    • 执行 I/O 操作的 Scala 代码可以在驱动程序上运行,但不能在执行程序上运行。
  • 在配置了单用户访问模式的计算上,不支持 Scala 中的 FUSE、使用卷路径访问数据的 Scala IO 代码,或 Scala UDF。 单个用户访问模式支持 Python UDF。

在所有支持的 Databricks Runtime 版本上:

  • Unity Catalog UDF 不支持访问卷文件路径。

  • 无法从 RDD 访问卷。

  • 不能将 spark-submit 与存储在卷中的 JAR 配合使用。

  • 不能定义通过 wheel 或 JAR 文件中的卷路径访问的其他库的依赖项。

  • 不能使用 /Volumes/<catalog-name>/Volumes/<catalog-name>/<schema-name> 模式列出 Unity Catalog 对象。 必须使用包含卷名称的完全限定路径。

  • REST API 的 DBFS 终结点不支持卷路径。

  • 卷从 Azure Databricks 工作区全局搜索结果中排除。

  • 不能将卷指定为群集日志传递的目标。

  • %sh mv 不支持在卷之间移动文件。 请改用 dbutils.fs.mv%sh cp

  • 不能使用卷创建自定义 Hadoop 文件系统,这意味着不支持以下内容:

    import org.apache.hadoop.fs.Path
    val path =  new Path("dbfs:/Volumes/main/default/test-volume/file.txt")
    val fs = path.getFileSystem(sc.hadoopConfiguration)
    fs.listStatus(path)
    
  • 必须在 Azure 数据工厂库配置面板中将路径格式与 dbfs:/ 方案配合使用。 例如 dbfs:/Volumes/<catalog-name>/<schema-name>/<volume-name>/file