本文介绍如何使用 COPY INTO 命令将数据从 Azure 帐户中的 Azure Data Lake Storage (ADLS) 容器加载到 Databricks SQL 中的表中。
本文中的步骤假定管理员已配置 Unity 目录卷或外部位置,以便可以在 ADLS 中访问源文件。 如果管理员已将计算资源配置为使用服务主体,请参阅使用 COPY INTO 和服务主体加载数据或教程:COPY INTO 和 Spark SQL。 如果管理员为你提供了临时凭据(Blob SAS 令牌),请按照使用 COPY INTO 和临时凭据加载数据中的步骤操作。
Databricks 建议使用卷来访问云存储中的文件,作为使用 COPY INTO 执行的引入过程的一部分。 有关使用卷和外部位置的建议的详细信息,请参阅 Unity Catalog 最佳做法。
开始之前
在使用 COPY INTO 从被定义为 Unity Catalog 外部位置的 Unity Catalog 存储卷或云对象存储路径来加载数据之前,您必须具备以下条件:
对
READ VOLUME卷的特权或READ FILES对外部位置的特权。 有关创建卷的详细信息,请参阅什么是 Unity Catalog 卷?。 有关创建外部位置的详细信息,请参阅 外部位置概述。您的源数据路径,可以是云对象存储的 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 目录特权的详细信息,请参阅 Unity 目录特权参考。
从卷加载数据
若要从 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:)也支持使用 dbfs:/Volumes/... 方案前缀,但 Databricks 建议使用上面所示的 /Volumes/ 路径格式。
使用外部位置加载数据
注意事项
Databricks 建议使用卷访问云存储中的文件。 支持使用外部位置,但这并不是推荐的方法。 请参阅 托管表和外部表。
以下示例使用 Unity 目录外部位置将数据从 ADLS 加载到表中,以提供对源数据的访问权限。
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 'abfss://container@storageAccount.dfs.core.chinacloudapi.cn'
FILEFORMAT = PARQUET;
COPY INTO sibling_table
FROM 'abfss://container@storageAccount.dfs.core.chinacloudapi.cn/json-data'
FILEFORMAT = JSON;
目标表的三级命名空间
可以使用三级命名空间(<catalog_name>.<schema_name>.<table_name>)将 Unity 目录表作为目标。 使用USE CATALOG <catalog_name>和USE SCHEMA <schema_name>命令为当前查询或笔记本设置默认目录和模式。
以下示例使用三级命名空间将数据从卷加载到表中:
COPY INTO quickstart_catalog.quickstart_schema.landing_table
FROM '/Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/raw_data'
FILEFORMAT = PARQUET;
还可以首先设置默认目录和架构:
USE CATALOG quickstart_catalog;
USE SCHEMA quickstart_schema;
COPY INTO landing_table
FROM '/Volumes/quickstart_catalog/quickstart_schema/quickstart_volume/raw_data'
FILEFORMAT = PARQUET;