包含 Parquet 文件中数据的 SqlPackage(预览版)

本文介绍了 SqlPackage 对于与存储在 Azure Blob 存储中的以 Parquet 格式的数据进行交互的支持。 对于 SQL Server 2022 和 Azure SQL 托管实例,SqlPackage 162.1.176 及更高版本中提供了支持从 Azure Blob 存储中的 Parquet 文件中提取数据(提取)和发布数据(发布)的预览功能。 不支持 Azure SQL 数据库和 SQL Server 2019 及更早版本。 导入导出 操作继续可用于 SQL Server、Azure SQL 托管实例和 Azure SQL 数据库。 对 Azure Blob 存储中 Parquet 文件的支持继续普遍适用于 Azure Synapse Analytics

使用 提取时,数据库架构(.dacpac 文件)将写入运行 SqlPackage 的本地客户端,数据以 Parquet 格式写入 Azure Blob 存储。 数据存储在具有两部分表名称的单个文件夹中。 CETAS 用于写入 Azure Blob 存储中的文件。

发布时,数据库架构(.dacpac 文件)从运行 SqlPackage 的本地客户端读取,数据以 Parquet 格式读取或写入 Azure Blob 存储。

在 Azure 中托管的 SQL 数据库中,相较于使用 .bacpac 文件的导入/导出操作,使用 Parquet 文件进行提取/发布操作在许多场景下能够提供更好的性能。

提取(导出数据)

若要将数据从数据库导出到 Azure Blob 存储,可使用带有以下属性的 SqlPackage 提取 操作。

  • /p:AzureStorageBlobEndpoint
  • /p:AzureStorageContainer
  • /p:AzureStorageKey 或 /p:AzureSharedAccessSignatureToken

通过存储帐户密钥授权数据库访问 Blob 存储容器。 数据库架构(.dacpac 文件)写入运行 SqlPackage 的本地客户端,数据以 Parquet 格式写入 Azure Blob 存储。

参数 /p:AzureStorageRootPath 是可选的,用于设置容器中的存储根路径。 如果没有此属性,路径默认为 servername/databasename/timestamp/。 数据存储在具有两部分表名称的单个文件夹中。 每个表创建的文件数取决于导出时 MAXDOP 和可用的 SQL 核心。

最后,属性 /p:TableData 指定导出了哪些表的数据。 指定表名时,可以选择在 schema_name.table_identifier 格式中包含或不包含名称部件周围的括号。 可以多次指定此属性来指示多个表。

以下示例将名为 databasename 的数据库从名为 yourserver 的服务器提取到当前目录中名为 databaseschema.dacpac 的本地文件。 数据使用名为 storageaccountkey的存储帐户密钥写入名为 storageaccount 的存储帐户中名为 containername 的容器。 数据将写入容器中 servername/databasename/timestamp/ 的默认路径。

SqlPackage /Action:Extract /SourceServerName:yourserver /SourceDatabaseName:databasename /TargetFile:databaseschema.dacpac /p:AzureStorageBlobEndpoint=https://storageaccount.blob.core.windows.net /p:AzureStorageContainer=containername /p:AzureStorageKey=storageaccountkey

有关可用的身份验证类型的更多示例,请参阅 SqlPackage 提取

发布(导入数据)

若要将数据从 Azure Blob 存储中的 Parquet 文件导入到数据库,SqlPackage 发布操作与以下属性一起使用:

  • /p:AzureStorageBlobEndpoint
  • /p:AzureStorageContainer
  • /p:AzureStorageRootPath
  • /p:AzureStorageKey 或 /p:AzureSharedAccessSignatureToken

可以通过存储帐户密钥或共享访问签名(SAS)令牌来授权发布访问权限。 数据库架构(.dacpac 文件)从运行 SqlPackage 的本地客户端读取,数据以 Parquet 格式从 Azure Blob 存储读取。

以下示例将名为 databasename 的数据库从当前目录中名为 databaseschema.dacpac 的本地文件发布到名为 yourserver 的服务器。 使用名为 storageaccountkey的存储帐户密钥从名为 storageaccount 的存储帐户中的容器 containername 读取数据。 数据从容器中每个表的路径 yourserver/databasename/10-19-2023_11-09-56/ 下的各个文件夹读取。

SqlPackage /Action:Publish /SourceFile:databaseschema.dacpac /TargetServerName:yourserver /TargetDatabaseName:databasename /p:AzureStorageBlobEndpoint=https://storageaccount.blob.core.windows.net /p:AzureStorageContainer=containername  /p:AzureStorageKey=storageaccountkey /p:AzureStorageRootPath="yourserver/databasename/10-19-2023_11-09-56/"

有关可用身份验证类型的更多示例,请参阅 SqlPackage 发布

局限性

Polybase

需要 Polybase 才能将 SqlPackage 操作用于 Parquet 文件。 以下查询可用于检查 Polybase 是否已启用:

// configuration_id = 16397 is 'allow polybase export'
// configuration_id = 16399 is 'polybase enabled'
SELECT configuration_id, value_in_use FROM sys.configurations
WHERE configuration_id IN (16397, 16399)

可能需要启用 PolybasePolybase 导出。 在 Azure SQL 托管实例上启用 Polybase 需要 PowerShell 或 Azure CLI。 建议在进行配置更改之前评估是否适合你的环境启用 Polybase。

表和数据类型

Parquet 文件的提取和发布操作支持 CETAS 支持的数据类型。

对 Parquet 文件的提取和发布操作启用了账本表。

使用 Always Encrypted 存储的数据不支持使用 Parquet 文件提取和发布操作。

在通过 SqlPackage 提取到 Parquet 之前,会检查数据库中是否存在不支持的类型,但您也可以使用 T-SQL 快速检查数据库。 以下示例查询返回一个结果集,其中包含不支持写入 Parquet 文件的类型和表。

SELECT DISTINCT C.DATA_TYPE, C.TABLE_SCHEMA, C.TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.COLUMNS C
    ON T.TABLE_SCHEMA = C.TABLE_SCHEMA 
    AND T.TABLE_NAME = C.TABLE_NAME
    AND T.TABLE_TYPE = 'BASE TABLE'
WHERE C.DATA_TYPE NOT IN (
    'binary',
    'varbinary',
    'char',
    'varchar',
    'nchar',
    'nvarchar',
    'smalldate',
    'smalldatetime',
    'date',
    'datetime',
    'datetime2',
    'datetimeoffset',
    'time',
    'decimal',
    'numeric',
    'float',
    'real',
    'bigint',
    'tinyint',
    'smallint',
    'int',
    'bigint',
    'bit',
    'money',
    'smallmoney',
    'uniqueidentifier'
)

后续步骤