创建和管理目录

本文介绍如何在 Unity Catalog 中创建和管理目录。 一个目录包含架构(数据库),而一个架构包含表、视图、卷、模型和函数。

注意

在为 Unity Catalog 自动启用的工作区中,默认情况下已为你创建一个工作区目录。 默认情况下,你工作区(且只有你工作区)中的所有用户有权访问它。 请参阅步骤 1:确认已为 Unity Catalog 启用工作区

注意

若要了解如何创建外部目录(一种在外部数据系统中镜像数据库的 Unity Catalog 对象),请参阅创建外部目录。 另请参阅管理和使用外部目录

要求

若要创建目录,请执行以下操作:

  • 你需要是 Azure Databricks 元存储管理员或拥有对元存储的 CREATE CATALOG 权限。

  • 你必须具有链接到在其中执行目录创建的工作区的 Unity Catalog 元存储。

  • 用于运行笔记本以创建目录的群集必须使用与 Unity Catalog 兼容的访问模式。 请参阅访问模式

    SQL 仓库始终支持 Unity Catalog。

创建目录

若要创建目录,可以使用目录资源管理器或 SQL 命令。

目录资源管理器

  1. 登录到链接到元存储的工作区。

  2. 单击 目录图标目录”。

  3. 单击“创建目录”按钮。

  4. 选择要创建的目录类型:

    • 标准目录:组织由 Unity Catalog 管理的数据资产的安全对象。 对于除 Lakehouse 联合之外的所有用例。
    • 外部目录:Unity Catalog 中的安全对象,它使用 Lakehouse Federation 镜像外部数据系统中的数据库。 请参阅《Lakehouse Federation 设置概述》。
  5. (可选但强烈建议)指定一个托管存储位置。 需要对目标外部位置具有 CREATE MANAGED STORAGE 权限。 请参阅在 Unity Catalog 中指定托管存储位置

    重要

    如果你的工作区没有默认元存储级存储位置,则你需要在创建目录时指定托管存储位置。

  6. 单击 “创建”

  7. (可选)指定目录绑定到的工作区。

    默认情况下,该目录与附加到当前元存储的所有工作区共享。 如果目录将包含限制为特定工作区的数据,请转到“工作区”选项卡并添加这些工作区。

    有关详细信息,请参阅(可选)将目录分配到特定工作区

  8. 为目录分配权限。 请参阅 Unity Catalog 特权和安全对象

SQL

  1. 在笔记本或 Databricks SQL 编辑器中运行以下 SQL 命令。 括号中的项是可选的。 替换占位符值替:

    • <catalog-name>:目录的名称。

    • <location-path>:可选但强烈建议使用。 如果希望此目录中托管表的存储位置不同于为元存储配置的默认根存储,请提供存储位置路径。

      重要

      如果你的工作区没有默认元存储级存储位置,则你需要在创建目录时指定托管存储位置。

      必须在外部位置配置中定义此路径,并且你必须对外部位置配置具有 CREATE MANAGED STORAGE 权限。 可以使用在该外部位置配置中定义的路径,也可以使用子路径(即 'abfss://my-container-name@storage-account-name.dfs.core.chinacloudapi.cn/finance''abfss://my-container-name@storage-account-name.dfs.core.chinacloudapi.cn/finance/product')。 需要 Databricks Runtime 11.3 及更高版本。

    • <comment>:说明或其他注释(可选)。

    注意

    如果要创建外部目录(Unity Catalog 中用于镜像外部数据系统中数据库的安全对象,可用于 Lakehouse 联合身份验证),则 SQL 命令为 CREATE FOREIGN CATALOG,并且选项是不同的。 请参阅创建外部目录

    CREATE CATALOG [ IF NOT EXISTS ] <catalog-name>
       [ MANAGED LOCATION '<location-path>' ]
       [ COMMENT <comment> ];
    

    例如,要创建名为 example 的目录:

    CREATE CATALOG IF NOT EXISTS example;
    

    如果要仅限帐户中的特定工作区能访问目录(也称为“工作区-目录”绑定),请参阅将目录绑定到一个或多个工作区

    有关参数说明,请参阅 CREATE CATALOG

  2. 为目录分配权限。 请参阅 Unity Catalog 权限和安全对象

创建目录时,会自动创建两个架构(数据库):defaultinformation_schema

还可使用 Databricks Terraform 提供程序databrics_catalog 创建目录。 可以使用 databricks_catalogs 检索有关目录的信息。

(可选)将目录分配到特定工作区

如果你使用工作区来隔离用户数据访问,则可能需要限制为从帐户中的特定工作区访问目录(这也称为工作区-目录绑定)。 默认设置是与附加到当前元存储的所有工作区共享目录。

你可以允许从工作区(默认)读取和写入目录,也可以指定只读访问权限。 如果指定只读,则会阻止从该工作区到该目录的所有写入操作。

将目录绑定到特定工作区的典型用例包括:

  • 确保用户只能从生产工作区环境访问生产数据。
  • 确保用户只能处理来自专用工作区的敏感数据。
  • 允许用户从开发人员工作区以只读方式访问生产数据,以便进行开发和测试。

注意

还可以将外部位置和存储凭据绑定到特定工作区,从而限制这些工作区中的特权用户访问外部位置中的数据。 请参阅(可选)将外部位置分配给特定工作区,以及(可选)向特定工作区分配存储凭据

工作区目录绑定示例

以生产和开发隔离为例。 如果指定只能从生产工作区访问生产数据目录,则会取代向用户颁发的任何单独授权。

目录-工作区绑定示意图

在此示意图中,prod_catalog 绑定到两个生产工作区。 假设已授予用户对 prod_catalog 中名为 my_table 的表的访问权限(使用 GRANT SELECT ON my_table TO <user>)。 如果该用户尝试访问 Dev 工作区中的 my_table,则会收到错误消息。 该用户只能从 Prod ETL 和 Prod Analytics 工作区访问 my_table

平台的所有区域都遵守工作区-目录绑定。 例如,如果你查询信息架构,则只会看到在发出查询的工作区中可访问的目录。 数据世系和搜索 UI 同样只显示分配到工作区的目录(无论是使用绑定还是默认设置)。

将目录绑定到一个或多个工作区

若要将目录分配到特定的工作区,可以使用目录资源管理器或 Unity Catalog REST API。

所需的权限:元存储管理员或目录所有者。

注意

元存储管理员可以使用目录资源管理器查看元存储中的所有目录,目录所有者可以查看他们在元存储中拥有的所有目录,无论目录是否已分配到当前工作区。 未分配到工作区的目录将灰显,并且没有任何子对象可见或可供查询。

目录资源管理器

  1. 登录到链接到元存储的工作区。

  2. 单击 目录图标目录”。

  3. 在“目录”窗格的左侧,单击目录名称。

    目录资源管理器主窗格默认会显示“目录”列表。 你也可以在该列表中选择目录。

  4. 在“工作区”选项卡上,清除“所有工作区拥有访问权限”复选框。

    如果目录已绑定到一个或多个工作区,则此复选框已清除。

  5. 单击“分配到工作区”,然后输入或查找要分配的工作区

  6. (可选)将工作区访问权限限制为只读。

    在“管理访问级别”菜单上,选择“将访问权限更改为只读”。

    随时都可通过编辑目录并选择“更改读取和写入权限”来反转此选择

若要撤销访问权限,请转到“工作区”选项卡,选择该工作区,然后单击“撤销”。

CLI

有两个 Databricks CLI 命令组,以及将目录分配给工作区所需的两个步骤。

在以下示例中,将 <profile-name> 替换为 Azure Databricks 身份验证配置文件的名称。 它应包括个人访问令牌的值,以及生成个人访问令牌的工作区的工作区实例名称和工作区 ID。 请参阅 Azure Databricks 个人访问令牌身份验证

  1. 使用 catalogs 命令组的 update 命令将目录的 isolation mode 设置为 ISOLATED

    databricks catalogs update <my-catalog> \
    --isolation-mode ISOLATED \
    --profile <profile-name>
    

    对于附加到元存储的所有工作区,默认的 isolation-mode 设置为 OPEN

  2. 使用 workspace-bindings 命令组的 update-bindings 命令将工作区分配到目录:

    databricks workspace-bindings update-bindings catalog <my-catalog> \
    --json '{
      "add": [{"workspace_id": <workspace-id>, "binding_type": <binding-type>}...],
      "remove": [{"workspace_id": <workspace-id>, "binding_type": "<binding-type>}...]
    }' --profile <profile-name>
    

    使用 "add""remove" 属性添加或删除工作区绑定。 <binding-type> 可以是 "BINDING_TYPE_READ_WRITE"(默认)或 "BINDING_TYPE_READ_ONLY"

要列出目录的所有工作区分配,可使用 workspace-bindings 命令组的 get-bindings 命令:

databricks workspace-bindings get-bindings catalog system <my-catalog> \
--profile <profile-name>

从工作区取消绑定目录

将目录绑定到一个或多个工作区中包含包括有关使用目录资源管理器或 bindings API 撤销工作区对目录的访问权限的说明。

重要

如果自动为 Unity Catalog 启用了工作区且有了一个工作区目录,则工作区管理员仅在该工作区中拥有该目录及对该目录的所有权限。 如果取消绑定该目录或将其绑定到其他目录,则需要将任何必需的权限手动授予工作区管理员组中的各成员或使用帐户级组的成员,因为工作区管理员组是工作区本地组。 有关帐户组与工作区本地组的详细信息,请参阅帐户组与工作区本地组的区别

将架构添加到目录

了解如何将架构(数据库)添加到目录。 请参阅创建和管理架构(数据库)

查看目录详细信息

若要查看有关目录的信息,可以使用目录资源管理器或 SQL 命令。

目录资源管理器

  1. 登录到链接到元存储的工作区。

  2. 单击 目录图标目录”。

  3. 在“目录”窗格中,找到目录并单击其名称。

    页面顶部将列出一些详细信息。 可以在“架构”、“详细信息”、“权限”和“工作区”选项卡上查看其他选项。

SQL

在笔记本或 Databricks SQL 编辑器中运行以下 SQL 命令。 括号中的项是可选的。 请替换 <catalog-name> 占位符。

有关详细信息,请参阅 DESCRIBE CATALOG

DESCRIBE CATALOG <catalog-name>;

使用 CATALOG EXTENDED 获取完整详细信息。

删除目录

若要删除目录,可以使用目录资源管理器或 SQL 命令。 若要删除目录,你必须是其所有者。

目录资源管理器

必须先删除目录中除 information_schema 以外的所有架构,才能删除目录。 这包括自动创建的 default 架构。

  1. 登录到链接到元存储的工作区。
  2. 单击 目录图标目录”。
  3. 在“目录”窗格的左侧,单击要删除的目录。
  4. 在“详细信息”窗格中,单击“创建数据库”按钮左侧的串形菜单 Kebab 菜单,然后选择“删除”
  5. 在“删除目录”对话框中,单击“删除”。

SQL

在笔记本或 Databricks SQL 编辑器中运行以下 SQL 命令。 括号中的项是可选的。 请替换 <catalog-name> 占位符。

有关参数说明,请参阅 DROP CATALOG

如果使用不带 CASCADE 选项的 DROP CATALOG,则必须先删除目录中除 information_schema 之外的所有架构,然后才能删除目录。 这包括自动创建的 default 架构。

DROP CATALOG [ IF EXISTS ] <catalog-name> [ RESTRICT | CASCADE ]

例如,若要删除名为 vaccine 的目录及其架构:

DROP CATALOG vaccine CASCADE

管理默认目录

为为 Unity Catalog 启用的每个工作区配置默认目录。 默认目录支持在不指定目录的情况下执行数据操作。 如果在执行数据操作时省略顶级目录名称,则会采用默认目录。

工作区管理员可以使用管理员设置 UI 查看或切换默认目录。 还可以使用 Spark 配置为群集设置默认目录。

将按以下顺序为目录运行不指定目录的命令(例如 GRANT CREATE TABLE ON SCHEMA myschema TO mygroup):

  1. 是使用 USE CATALOG 语句还是 JDBC 设置为会话设置目录?
  2. 是否在群集上设置了 Spark 配置 spark.databricks.sql.initial.catalog.namespace
  3. 是否为群集设置了工作区默认目录?

启用 Unity Catalog 时的默认目录配置

最初为工作区配置的默认目录取决于为 Unity Catalog 启用工作区时的方式:

  • 对于自动为 Unity Catalog 启用的某些工作区,工作区目录被设置为默认目录。 请参阅 Unity Catalog 的自动启用
  • 对于所有其他工作区,hive_metastore 目录被设置为默认目录。

如果要在现有工作区中从 Hive 元存储转换到 Unity Catalog,则通常有必要使用 hive_metastore 作为默认目录,以避免影响引用了 hive 元存储的已有代码。

更改默认目录

工作区管理员可以更改工作区的默认目录。 有权创建或编辑群集的任何人都可为群集设置一个不同的默认目录。

警告

更改默认目录可能会中断依赖默认目录的现有数据操作。

为工作区配置一个不同的默认目录:

  1. 以工作区管理员身份登录到工作区。
  2. 在工作区顶部栏中单击你的用户名,然后从下拉列表中选择“设置”
  3. 单击“高级” 选项卡。
  4. 在“工作区的默认目录”行上,输入目录名称,然后单击“保存”。

重启 SQL 仓库和群集,使更改生效。 所有新的和重启的 SQL 仓库和群集都将使用此目录作为工作区的默认目录。

还可以通过在群集上设置以下 Spark 配置来替代特定群集的默认目录。 此方法不适用于 SQL 仓库:

spark.databricks.sql.initial.catalog.name

有关说明,请参阅 Spark 配置

查看当前默认目录

要获取工作区的当前默认目录,可在笔记本或 SQL 编辑器查询中使用 SQL 语句。 工作区管理员可使用管理员设置 UI 获取默认目录。

管理员设置

  1. 以工作区管理员身份登录到工作区。
  2. 在工作区顶部栏中单击你的用户名,然后从下拉列表中选择“设置”
  3. 单击“高级” 选项卡。
  4. 在“工作区的默认目录”行上查看目录名称。

SQL

在 SQL 仓库上或与 Unity Catalog 兼容的群集上运行的笔记本中或 SQL 编辑器查询中运行以下命令。 只要会话上未设置任何 USE CATALOG 语句或 JDBC 设置且没有为群集设置 spark.databricks.sql.initial.catalog.namespace 配置,就会返回工作区默认目录。

SELECT current_catalog();