使用 COPY INTO 和 Unity Catalog 卷或外部位置加载数据

了解如何使用 COPY INTO 将 COPY INTO 支持的任何源和文件格式的数据引入到 Unity Catalog 托管表或外部表。 Unity Catalog 添加了用于配置对原始数据的安全访问的新选项。 可以使用 Unity Catalog 卷或外部位置访问云对象存储中的数据。

Databricks 建议在使用 COPY INTO 执行的引入过程中,使用卷来访问云存储中的文件。 有关使用卷和外部位置的建议的详细信息,请参阅 Unity Catalog 最佳做法

本文介绍如何使用 COPY INTO 命令将数据从 Azure 帐户中的 Azure Data Lake Storage Gen2 (ADLS Gen2) 容器加载到 Databricks SQL 的表中。

本文中的步骤假定管理员已配置 Unity Catalog 卷或外部位置,以便你可以访问 ADLS Gen2 中的源文件。 如果管理员已将计算资源配置为使用服务主体,请参阅使用 COPY INTO 和服务主体加载数据教程:COPY INTO 和 Spark SQL。 如果管理员为你提供了临时凭据(Blob SAS 令牌),请按照使用 COPY INTO 和临时凭据加载数据中的步骤操作。

开始之前

在使用 COPY INTO 从定义为 Unity Catalog 外部位置的某个 Unity Catalog 卷或云对象存储路径加载数据之前,必须满足以下条件:

  • READ VOLUME 卷的特权或 READ FILES 对外部位置的特权。

    有关创建卷的详细信息,请参阅创建和使用卷

    有关创建外部位置的详细信息,请参阅创建外部位置以将云存储连接到 Azure Databricks

  • 源数据的路径,采用云对象存储 URL 或卷路径的形式。

    示例云对象存储 URL:abfss://container@storageAccount.dfs.core.chinacloudapi.cn/raw-data/json

    示例卷路径:/Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/raw_data/json

  • 对包含目标表的架构的 USE SCHEMA 特权。

  • 对父目录的 USE CATALOG 特权。

有关 Unity Catalog 特权的详细信息,请参阅 Unity Catalog 特权和安全对象

从卷加载数据

若要从 Unity Catalog 卷加载数据,必须拥有 READ VOLUME 特权。 卷特权适用于指定位置下的所有嵌套目录。

例如,如果有权访问使用路径 /Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/ 的卷,则以下命令有效:

COPY INTO landing_table
FROM '/Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/raw_data'
FILEFORMAT = PARQUET;

COPY INTO json_table
FROM '/Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/raw_data/json'
FILEFORMAT = JSON;

(可选)还可以将卷路径与 dbfs 方案配合使用。 例如,以下命令也有效:

COPY INTO landing_table
FROM 'dbfs:/Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/raw_data'
FILEFORMAT = PARQUET;

COPY INTO json_table
FROM 'dbfs:/Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/raw_data/json'
FILEFORMAT = JSON;

使用外部位置加载数据

以下示例从 ADLS Gen2 将数据加载到表中,使用 Unity Catalog 外部位置提供对源代码的访问权限。

COPY INTO my_json_data
FROM 'abfss://container@storageAccount.dfs.core.chinacloudapi.cn/jsonData'
FILEFORMAT = JSON;

外部位置特权继承

外部位置特权适用于指定位置下的所有嵌套目录。

例如,如果有权访问使用 URL abfss://container@storageAccount.dfs.core.chinacloudapi.cn/raw-data 定义的外部位置,则以下命令有效:

COPY INTO landing_table
FROM 'abfss://container@storageAccount.dfs.core.chinacloudapi.cn/raw-data'
FILEFORMAT = PARQUET;

COPY INTO json_table
FROM 'abfss://container@storageAccount.dfs.core.chinacloudapi.cn/raw-data/json'
FILEFORMAT = JSON;

此外部位置的权限并不授予指定位置上级目录或平行目录的任何权限。 例如,以下命令均无效:

COPY INTO parent_table
FROM 's3://landing-bucket'
FILEFORMAT = PARQUET;

COPY INTO sibling_table
FROM 's3://landing-bucket/json-data'
FILEFORMAT = JSON;

目标表的三级命名空间

可以使用三层标识符 (<catalog_name>.<database_name>.<table_name>) 定位 Unity Catalog 表。 可以使用 USE CATALOG <catalog_name>USE <database_name> 命令为当前查询或笔记本设置默认目录和数据库。