首页 » DB » 正文

使用 PolyBase 将数据加载到 Azure SQL 数据仓库

使用 PolyBase 是将大量数据加载到高吞吐量 Azure SQL 数据仓库的有效方法。 使用 PolyBase 而非默认 BULKINSERT 机制可以实现吞吐量的巨大增加。

  • 如果源数据位于 Azure Data Lake Storage Gen2 中,且格式与 PolyBase 兼容,则可使用复制活动直接调用 PolyBase,让 Azure SQL 数据仓库从源拉取数据。
  • 如果 PolyBase 最初不支持源数据存储和格式,请改用 使用 PolyBase 的暂存复制 功能。 暂存复制功能也能提供更高的吞吐量。它自动将数据转换为 PolyBase 兼容的格式。 它将数据存储在 Azure Blob 存储中。 然后,它将数据载入 SQL 数据仓库。

使用 PolyBase 直接复制

SQL 数据仓库 PolyBase 直接支持 Azure Blob 和 Azure Data Lake Storage Gen2。 如果源数据满足本部分所述的条件,请使用 PolyBase 从源数据存储直接复制到 Azure SQL 数据仓库。 否则,请改用使用 PolyBase 的暂存复制。

如果不满足要求,Azure 数据工厂会检查设置,并自动回退到 BULKINSERT 机制以进行数据移动。

  1. 源链接的服务使用以下类型和身份验证方法:
    支持的源数据存储类型 支持的源身份验证类型
    Azure Blob 帐户密钥身份验证, 托管标识身份验证
    Azure Data Lake Storage Gen2 帐户密钥身份验证, 托管标识身份验证

     重要: 如果 Azure 存储配置了 VNet 服务终结点,则必须使用托管标识身份验证 。

  2. 源数据格式为 ParquetORC 或“分隔文本”, 使用以下配置:
    1. 文件夹路径不包含通配符筛选器。
    2. 文件名指向单个文件,或者为 * 或 *.*
    3. rowDelimiter 必须是 \n
    4. 将 nullValue 设置为“空字符串”(“”)或保留为默认值,并将 treatEmptyAsNull 设置为默认值或 true 。
    5. encodingName 设置为 utf-8(默认值)。
    6. quoteCharescapeChar 和 skipLineCount 未指定。 PolyBase 支持跳过可以在 ADF 中配置为 firstRowAsHeader 的标头行。
    7. compression 可为无压缩GZip 或 Deflate
JSON
"activities":[
    {
        "name": "CopyFromAzureBlobToSQLDataWarehouseViaPolyBase",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "BlobDataset",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "AzureSQLDWDataset",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "BlobSource",
            },
            "sink": {
                "type": "SqlDWSink",
                "allowPolyBase": true
            }
        }
    }
]

使用 PolyBase 的暂存复制

源数据不满足上一部分所述的条件时,请通过暂存 Azure Blob 存储实例启用数据复制。 该实例不能是 Azure 高级存储。 在这种情况下,Azure 数据工厂会自动针对数据运行转换,以满足 PolyBase 的数据格式要求。 然后,它使用 PolyBase 将数据加载到 SQL 数据仓库。 最后,它会从 Blob 存储中清理临时数据。

若要使用此功能,请创建 Azure Blob 存储链接服务,该服务引用使用临时 blob 存储的 Azure 存储帐户。 然后为复制活动指定 enableStaging 和 stagingSettings 属性,如以下代码所示。

 重要:如果临时 Azure 存储配置了 VNet 服务终结点,则必须使用托管标识身份验证

JSON
"activities":[
    {
        "name": "CopyFromSQLServerToSQLDataWarehouseViaPolyBase",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "SQLServerDataset",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "AzureSQLDWDataset",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "SqlSource",
            },
            "sink": {
                "type": "SqlDWSink",
                "allowPolyBase": true
            },
            "enableStaging": true,
            "stagingSettings": {
                "linkedServiceName": {
                    "referenceName": "MyStagingBlob",
                    "type": "LinkedServiceReference"
                }
            }
        }
    }
]

有关使用 PolyBase 的最佳做法

除了 Azure SQL 数据仓库的最佳做法中提到的最佳做法以外,以下部分提供了其他最佳做法。

所需数据库权限

若要使用 PolyBase,将数据加载到 SQL 数据仓库的用户必须对目标数据库拥有“CONTROL”权限。 一种实现方法是将该用户添加为 db_owner 角色的成员。

行大小和数据类型限制

PolyBase 负载限制为小于 1 MB 的行。 不能用它加载到 VARCHR(MAX)、NVARCHAR 或 VARBINARY(MAX)。

如果数据源中的行大于 1 MB,可能需要将源表垂直拆分为多个小型表。 确保每行的最大大小不超过该限制。 然后,可以使用 PolyBase 加载这些小型表,并在 Azure SQL 数据仓库中将它们合并在一起。

另外,对于列这样宽的数据,可以使用非 PolyBase 通过 ADF 来加载数据,只需关闭“允许 PolyBase”设置即可。

排查 PolyBase 问题

加载到“小数”列

如果源数据为文本格式,或者位于其他非 PolyBase 兼容存储(使用暂存复制和 PolyBase)中,并且包含的空值需加载到 SQL 数据仓库“小数”列中,则可能出现以下错误:

ErrorCode=FailedDbOperation, ......HadoopSqlException: Error converting data type VARCHAR to DECIMAL.....Detailed Message=Empty string can't be converted to DECIMAL.....

解决方案是在复制活动接收器 -> PolyBase 设置中取消选中“使用类型默认值”选项(为 false)。 “USE_TYPE_DEFAULT”是 PolyBase 本机配置,用于指定 PolyBase 从文本文件检索数据时如何处理分隔文本文件中的缺失值。

发表评论