外部位置

适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime 勾选“是” 仅 Unity Catalog

Unity Catalog 和内置 Azure Databricks Hive 元存储使用托管表的默认位置。 Unity Catalog 引入了几个新的安全对象来授予云对象存储数据权限。

外部位置

外部位置是一个安全的对象,它将存储路径与授权访问该路径的存储凭据相结合。

外部位置的创建者是其初始所有者。 外部位置的所有者可以修改外部位置的名称、URI 和存储凭据。

创建外部位置后,可以向帐户级主体(用户和组)授予其访问权限。

有权使用外部位置的用户或组可以访问该位置路径中的任何存储路径,而无需直接访问存储凭据。

要进一步细化访问控制,你可以在外部表上使用 GRANT 来封装对外部位置中各文件的访问。

外部位置名称是非限定的,并且在元存储中必须是唯一的。

任何外部位置的存储路径都不能包含在另一个外部位置的存储路径中,也不能包含在使用显式存储凭据的外部表的存储路径中。

警告

如果在工作区级别的 Hive 元存储中注册了架构(数据库),则使用 CASCADE 选项删除该架构会导致递归删除该架构位置中的所有文件,而不管表类型(托管或外部)如何。

如果架构已注册到 Unity Catalog 元存储,Unity Catalog 托管表的文件将被递归删除。 但是,不会删除外部表的文件。 必须直接使用云存储提供商来管理这些文件。

因此,为避免数据意外丢失,永远不应将 Hive 元存储中的架构注册到具有现有数据的位置。 也不应在由 Hive 元存储架构管理的位置或包含 Unity Catalog 托管表的位置创建新的外部表。

关系的图形表示

下图描述了它们之间的关系:

  • 存储凭据
  • 外部位置
  • 外部表
  • 存储路径
  • IAM 实体
  • Azure 服务帐户

E外部位置 ER 图

示例

-- Grant `finance` user permission to create external location on `my_azure_storage_cred` storage credential, and then create an external location on the specific path to which `my_azure_storage_cred` has access
> GRANT CREATE EXTERNAL LOCATION ON STORAGE CREDENTIAL `my_azure_storage_cred` TO `finance`
> CREATE EXTERNAL LOCATION `finance_loc` URL 'abfss://container@storageaccount.dfs.core.chinacloudapi.cn/depts/finance'
    WITH (CREDENTIAL `my_azure_storage_cred`)
    COMMENT 'finance';

-- Grant read, write, and create table access to the finance location to `finance` user
> GRANT READ FILES, WRITE FILES, CREATE EXTERNAL TABLE ON EXTERNAL LOCATION `finance_loc` TO `finance`;

-- `finance` can read from any storage path under abfss://depts/finance but nowhere else
> SELECT count(1) FROM `delta`.`abfss://container@storageaccount.dfs.core.chinacloudapi.cn/depts/finance` WITH (CREDENTIAL my_azure_storage_cred);
  100
> SELECT count(1) FROM `delta`.`abfss://container@storageaccount.dfs.core.chinacloudapi.cn/depts/hr/employees` WITH (CREDENTIAL my_azure_storage_cred);
  Error

-- `finance` can create an external table over specific object within the `finance_loc` location
> CREATE TABLE main.default.sec_filings LOCATION 'abfss://container@storageaccount.dfs.core.chinacloudapi.cn/depts/finance/sec_filings';

-- Cannot list files under an external table with a user that doesn't have SELECT permission on it
> LIST 'abfss://container@storageaccount.dfs.core.chinacloudapi.cn/depts/finance/sec_filings'
  Error
> LIST 'abfss://container@storageaccount.dfs.core.chinacloudapi.cn/depts/finance/sec_filings/_delta_log'
  Error