你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为专用 SQL 池设计 Polybase 数据加载策略

传统的对称多处理系统 (SMP) 数据仓库使用提取、转换和加载 (ETL) 过程来加载数据。 Azure SQL 池是一种大规模并行处理 (MPP) 体系结构,可以利用计算和存储资源的可伸缩性和灵活性。

相比之下,提取、加载和转换 (ELT) 过程可以利用内置分布式查询处理功能,无需在加载数据之前投入资源来转换数据。

虽然 SQL 池支持包括非 Polybase 选项(例如批量复制程序 (BCP) 和 SQL BulkCopy API)在内的许多加载方法,但最快且最具可伸缩性的数据加载方法是使用 PolyBase。 PolyBase 是这样一种技术,可以通过 Transact-SQL (T-SQL) 语言访问存储在 Azure Blob 存储或 Azure Data Lake Storage 中的外部数据。

实现 Polybase ELT

提取、加载和转换 (ELT) 是指将数据从源系统提取并加载到数据仓库然后再进行转换的过程。

为专用 SQL 池实施 PolyBase ELT 的基本步骤如下:

  1. 将源数据提取到文本文件中
  2. 将数据移入 Azure Blob 存储或 Azure Data Lake Storage
  3. 准备要加载的数据
  4. 使用 PolyBase 将数据载入专用 SQL 池临时表
  5. 转换数据
  6. 将数据插入生产表中

有关加载教程,请参阅加载纽约出租车数据集

有关详细信息,请参阅加载模式和策略

将源数据提取到文本文件中

从源系统中取出数据的过程取决于存储位置。 目标是将数据移动到 PolyBase 支持的带分隔符的文本文件中。

PolyBase 外部文件格式

PolyBase 从 UTF-8 和 UTF-16 编码的带分隔符文本文件加载数据。 PolyBase 还会从 Hadoop 文件格式 RC File、ORC 和 Parquet 加载。 PolyBase 还可以从 Gzip 和 Snappy 压缩文件加载数据。 PolyBase 目前不支持扩展的 ASCII、固定宽度格式或 WinZip、JSON 和 XML 等嵌套格式。

如果要从 SQL Server 中导出,可以使用 bcp 命令行工具,以将数据导出为带分隔符的文本文件。 下表列出了映射到 Azure Synapse Analytics 的 Parquet 数据类型。

Parquet 数据类型 SQL 数据类型
tinyint tinyint
smallint smallint
int int
bigint bigint
boolean bit
Double FLOAT
FLOAT real
Double money
Double smallmoney
string nchar
string nvarchar
string char
string varchar
binary binary
binary varbinary
timestamp date
timestamp smalldatetime
timestamp datetime2
timestamp datetime
timestamp time
date date
decimal 十进制

将数据移入 Azure Blob 存储或 Azure Data Lake Store

若要将数据移入 Azure 存储,可将它移到 Azure Blob 存储Azure Data Lake Storage。 不管什么位置,都应将数据存储在文本文件中。 PolyBase 可从任一位置加载数据。

可以使用以下工具和服务将数据移动到 Azure 存储:

  • Azure ExpressRoute 服务可以增强网络吞吐量、性能和可预测性。 ExpressRoute 是通过专用连接将数据路由到 Azure 的服务。 ExpressRoute 连接不通过公共 Internet 路由数据。 与基于公共 Internet 的典型连接相比,这些连接提供更高的可靠性、更快的速度、更低的延迟和更高的安全性。
  • AzCopy 实用工具可以通过公共 Internet 将数据移到 Azure 存储。 如果数据小于 10 TB,则很适合使用此工具。 若要使用 AzCopy 定期执行加载操作,请测试网络速度是否在可接受的范围内。
  • Azure 数据工厂提供一个可以安装在本地服务器上的网关。 然后,你可以创建管道,以便将数据从本地服务器移到 Azure 存储。 若要将数据工厂与专用 SQL 池配合使用,请参阅将数据加载到 Azure Synapse Analytics 中

准备要加载的数据

在将存储帐户中的数据载入专用 SQL 池之前,可能需要对其进行准备和清理。 可以在数据仍保留在源中、将数据导出到文本文件时或者在数据进入 Azure 存储之后执行数据准备。 最好是在加载过程的早期阶段处理数据。

定义外部表

在加载数据之前,需要在数据仓库中定义外部表。 PolyBase 使用外部表来定义和访问 Azure 存储中的数据。 外部表类似于数据库视图。 外部表包含表模式,并指向存储在数据仓库外部的数据。

定义外部表涉及到指定数据源、文本文件的格式和表定义。 以下是所需的 T-SQL 语法主题:

设置文本文件的格式

定义外部对象后,需要使文本文件中的行与外部表和文件格式定义相符。 文本文件的每一行中的数据必须与表定义相符。 设置文本文件的格式:

  • 如果数据来自非关系源,则需要将其转换为行与列。 不管数据来自关系源还是非关系源,都必须转换数据,使之与数据预期要载入到的表的列定义相符。
  • 设置文本文件中数据的格式,使之与 SQL 池目标表中的列和数据类型相符。 外部文本文件与数据仓库表中的数据类型不相符会导致在加载期间拒绝行。
  • 使用终止符分隔文本文件中的字段。 请务必使用源数据中不包含的字符或字符序列。 使用通过 CREATE EXTERNAL FILE FORMAT 指定的终止符。

使用 PolyBase 将数据载入专用 SQL 池临时表

这是将数据加载到临时表中的最佳做法。 使用临时表可以处理错误且不干扰生产表。 将数据插入生产表之前,还可以通过临时表使用 SQL 池内置分布式查询处理功能进行数据转换。

使用 PolyBase 加载数据的选项

若要使用 PolyBase 加载数据,可以使用下列任一加载选项:

非 PolyBase 加载选项

如果数据与 PolyBase 不兼容,可以使用 bcpSQLBulkCopy API。 BCP 将数据直接加载到专用 SQL 池,而无需经过 Azure Blob 存储,但只适用于小规模的加载。 请注意,这些选项的加载性能低于 PolyBase。

转换数据

在数据已进入临时表时,请执行工作负荷所需的转换。 然后将数据移到生产表。

将数据插入生产表

INSERT INTO ... SELECT 语句将数据从临时表移到永久表。

设计 ETL 过程时,请尝试针对一个较小的测试示例运行该过程。 尝试将表中的 1,000 行提取到某个文件,将该文件移到 Azure,然后将其载入临时表。

合作伙伴加载解决方案

我们的很多合作伙伴都提供加载解决方案。 有关详细信息,请参阅我们的解决方案合作伙伴列表。