你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用托管标识加载外部数据
本文介绍如何使用托管标识从 Azure Data Lake Storage (ADLS) Gen2 帐户创建外部表或引入数据。
先决条件
完成本教程需要以下资源:
- Azure Data Lake Storage (ADLS) Gen2 帐户
- Azure Synapse Analytics 工作区和专用 SQL 池
为工作区标识授予对存储帐户的访问权限
每个 Azure Synapse Analytics 工作区都会自动创建一个托管标识,用于帮助配置对工作区外部数据的安全访问。 若要详细了解 Azure Synapse Analytics 的托管标识,请访问 Azure Synapse Analytics 的托管服务标识。
若要使托管标识能够访问 ADLS Gen2 帐户上的数据,需要授予对源帐户的标识访问权限。 若要授予适当权限,请执行以下步骤:
- 在 Azure 门户中找到你的存储帐户。
- 选择“数据存储”- >“容器”,导航到外部表需要访问的源数据所在的文件夹。
- 选择“访问控制(IAM)”。
- 选择“添加”->“添加角色分配”。
- 在作业函数角色列表中,选择“存储 Blob 数据参与者”,然后选择“下一步”。
- 在“添加角色分配”页上,选择“+ 选择成员”。 此时会打开“选择成员”窗格。
- 键入工作区标识的名称。 工作区标识与工作区名称相同。 显示后,选择工作区标识,然后单击“选择”。
- 在“添加角色分配”页中,确保“成员”列表包含所需的 Microsoft Entra ID 帐户。 验证后,选择“查看 + 分配”。
- 在确认页中,查看更改,然后选择“查看 + 分配”。
工作区标识现在是存储 Blob 数据参与者角色的成员,并且有权访问源文件夹。
注意
这些步骤也适合用于保护配置为限制公共访问的 ADLS Gen2 帐户。 若要详细了解如何保护 ADLS Gen2 帐户,请参阅配置 Azure 存储防火墙和虚拟网络。
使用 COPY INTO 引入数据
利用 T-SQL COPY INTO
语句,可以灵活地将高吞吐量数据引入表,这是将数据引入专用 SQL 池表的主要策略。 COPY INTO
支持用户从外部位置引入数据,而无需创建外部表所需的任何额外的数据库对象。
若要使用工作区托管标识运行 COPY INTO
语句进行身份验证,请使用以下 T-SQL 命令:
COPY INTO <TableName>
FROM 'https://<AccountName>.dfs.core.windows.net/<Container>/<Folder>/ '
WITH
(
CREDENTIAL = (IDENTITY = 'Managed Identity'),
[<CopyIntoOptions>]
);
其中:
<TableName>
是要将数据引入到其中的表的名称<AccountName>
是 ADLS Gen2 帐户名称<Container>
是存储源数据的存储帐户中的容器的名称<Folder>
是容器中存储源数据的文件夹(或带有子文件夹的路径)。 如果直接指向单个文件,还可以提供文件名。<CopyIntoOptions>
是要提供给 COPY INTO 语句的任何其他选项的列表。
若要了解详细信息并探索 COPY INTO 的完整语法,请参阅 COPY INTO (Transact-SQL)。
使用外部表查询 ADLS Gen2 上的数据
外部表支持用户查询 Azure Data Lake Storage (ADLS) Gen2 帐户中的数据,而无需先引入数据。 用户可以创建指向 ADLS Gen2 容器上的文件的外部表,并像常规用户表一样对其进行查询。
以下步骤介绍了如何使用托管标识进行身份验证,以新建指向 ADLS Gen2 上的数据的外部表。
创建所需的数据库对象
外部表需要创建以下对象:
- 数据库主密钥,用于加密数据库范围的凭据的机密
- 使用工作区标识的数据库范围的凭据
- 指向源文件夹的外部数据源
- 用于定义源文件格式的外部文件格式
- 用于查询的外部表定义
若要执行这些步骤,请使用 Azure Synapse 工作区中的 SQL 编辑器或使用连接到专用 SQL 池的首选 SQL 客户端。 让我们详细了解这些步骤。
创建数据库主密钥
数据库主密钥是指用于保护证书私钥的对称密钥,数据库中存在的非对称密钥,以及数据库范围内凭据中的机密。 如果数据库中已有主密钥,则无需创建新的密钥。 将 <Secure Password>
替换为安全密码。 此密码用于加密数据库中的主密钥。
若要创建主密钥,请使用以下 T-SQL 命令:
-- Replace <Secure Password> with a secure password
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Secure Password>';
若要详细了解数据库主密钥,请参阅 CREATE MASTER KEY (Transact-SQL)。
创建数据库范围的凭据
数据库范围的凭据使用工作区标识,每当外部表需要访问源数据时,该凭据都需要访问外部位置。
若要创建数据库范围的凭据,请使用以下命令。 将 <CredentialName>
替换为要用于数据库范围的凭据的名称。
CREATE DATABASE SCOPED CREDENTIAL <CredentialName> WITH IDENTITY = 'Managed Service Identity';
若要详细了解数据库范围的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)。
创建外部数据源
下一步是创建一个外部数据源,以指定外部表所使用的源数据驻留的位置。
要创建外部数据源,请使用以下 T-SQL 命令:
CREATE EXTERNAL DATA SOURCE <ExternalDataSourceName>
WITH (
TYPE = HADOOP,
LOCATION = 'abfss://<Container>@<AccountName>.dfs.core.windows.net/<Folder>/',
CREDENTIAL = <CredentialName>
);
其中:
<ExternalDataSourceName>
是要用于外部数据源的名称。<AccountName>
是你的 ADLS Gen2 帐户名称。<Container>
是存储源数据的存储帐户中容器的名称。<Folder>
是存储在容器中的源数据所在的文件夹(或包含子文件夹的路径)。 如果直接指向单个文件,还可以提供文件名。<Credential>
是前面创建的数据库范围的凭据的名称。
若要详细了解外部数据源,请参阅 CREATE EXTERNAL DATA SOURCE (Transact-SQL)。
创建外部文件格式
下一步是创建外部文件格式。 它指定外部表引用的数据的实际布局。
要创建外部文件格式,请使用以下 T-SQL 命令。 将 <FileFormatName>
替换为要用于外部文件格式的名称。
CREATE EXTERNAL FILE FORMAT <FileFormatName>
WITH (
FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS (
FIELD_TERMINATOR = ',',
STRING_DELIMITER = '"',
FIRST_ROW = 2,
USE_TYPE_DEFAULT = True
)
);
在此示例中,根据源数据视需要调整 FIELD_TERMINATOR
、STRING_DELIMITER
、FIRST_ROW
等参数。 若要了解更多格式设置选项并详细了解 EXTERNAL FILE FORMAT
,请参阅 CREATE EXTERNAL FILE FORMAT。
创建外部表
创建用于保存元数据以安全访问外部数据所需的所有对象后,即可创建外部表。 若要创建外部表,请使用以下 T-SQL 命令:
-- Adjust the table name and columns to your desired name and external table schema
CREATE EXTERNAL TABLE <ExternalTableName> (
Col1 INT,
Col2 NVARCHAR(100),
Col4 INT
)
WITH
(
LOCATION = '<Path>',
DATA_SOURCE = <ExternalDataSourceName>,
FILE_FORMAT = <FileFormatName>
);
其中:
<ExternalTableName>
是要用于外部表的名称。<Path>
是源数据的路径(相对于外部数据源中指定的位置)。<ExternalDataSourceName>
是之前创建的外部数据源的名称。<FileFormatName>
是之前创建的外部文件格式的名称。
请确保将表名称和架构调整为所需名称和源文件中数据的架构。
查询外部表
此时,将创建访问外部表所需的所有元数据。 要测试外部表,请使用以下 T-SQL 示例等查询来验证工作:
SELECT TOP 10 Col1, Col2 FROM <ExternalTableName>;
如果已正确配置所有内容,应会在此查询的结果中看到来自源数据的数据。
若要了解详细信息并了解 CREATE EXTERNAL TABLE
的完整语法,请参阅 CREATE EXTERNAL TABLE (Transact-SQL)。