为专用 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
小整数 小整数
整数 整数
大数 大数
布尔 位
双精度 浮动
浮动 实数
双精度 钱
双精度 smallmoney
字符串 nchar
字符串 nvarchar
字符串 字符型
字符串 varchar
二进制 二进制
二进制 varbinary
时间戳 日期
时间戳 smalldatetime
时间戳 datetime2
时间戳 日期/时间
时间戳 时间
日期 日期
小数 小数

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

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

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

  • Azure ExpressRoute 服务可以增强网络吞吐量、性能和可预测性。 ExpressRoute 是通过专用连接将数据路由到 Azure 的服务。 ExpressRoute 连接不会通过公共互联网传输数据。 与基于公共 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 不兼容,可以使用 bcp 或 SQLBulkCopy API。 BCP 将数据直接加载到专用 SQL 池,而无需经过 Azure Blob 存储,但只适用于小规模的加载。 请注意,这些选项的加载性能低于 PolyBase。

转换数据

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

将数据插入生产表

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

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