本文介绍了 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 存储。 数据存储在具有两部分表名称的单个文件夹中。 CREATE EXTERNAL TABLE AS SELECT (CETAS) 用于写入 Azure Blob 存储中的文件。
发布时,数据库架构(.dacpac
文件)从运行 SqlPackage 的本地客户端读取,数据以 Parquet 格式读取或写入 Azure Blob 存储。
在 Azure 中托管的 SQL 数据库中,相较于使用 .bacpac
文件的导入/导出操作,使用 Parquet 文件进行提取/发布操作在许多场景下能够提供更好的性能。
提取(导出数据)
若要将数据从数据库导出到 Azure Blob 存储,可使用带有以下属性的 SqlPackage 提取 操作。
/p:AzureStorageBlobEndpoint
/p:AzureStorageContainer
/p:AzureSharedAccessSignatureToken
或/p:AzureStorageKey
(不支持与 SQL Server 一起使用)
从数据库中提取的数据摘要的屏幕截图,该数据包含写入 SqlPackage 环境的 .dacpac 文件和写入 Azure Blob 存储的表数据,这些数据以 parquet 文件格式存储。
通过存储帐户密钥授权数据库访问 Blob 存储容器。 数据库架构(.dacpac 文件)写入运行 SqlPackage 的本地客户端,数据以 Parquet 格式写入 Azure Blob 存储。
参数 /p:AzureStorageRootPath
是可选的,用于设置容器中的存储根路径。 如果没有此属性,路径默认为 servername/databasename/timestamp/
。 数据存储在具有两部分表名称的单个文件夹中。 每个表创建的文件数取决于导出时 MAXDOP 和可用的 SQL 核心。
最后,属性 /p:TableData
指定导出了哪些表的数据。 指定表名时,可以选择在 schema_name.table_identifier 格式中包含或不包含名称部件周围的括号。 可以多次指定此属性来指示多个表。
例
以下示例将名为 databasename
的数据库从名为 yourserver
的服务器提取到当前目录中名为 databaseschema.dacpac
的本地文件。 数据使用名为 containername
的存储帐户密钥写入名为 storageaccount
的存储帐户中名为 storageaccountkey
的容器。 数据将写入容器中 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:AzureSharedAccessSignatureToken
或/p:AzureStorageKey
(不支持与 SQL Server 一起使用)
可以通过存储帐户密钥或共享访问签名(SAS)令牌来授权发布访问权限。 数据库架构(.dacpac 文件)从运行 SqlPackage 的本地客户端读取,数据以 Parquet 格式从 Azure Blob 存储读取。
例
以下示例将名为 databasename
的数据库从当前目录中名为 yourserver
的本地文件发布到名为 databaseschema.dacpac
的服务器。 使用名为 containername
的存储帐户密钥从名为 storageaccount
的存储帐户中的容器 storageaccountkey
读取数据。 数据从容器中每个表的路径 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
对于处理 Parquet 文件的 SqlPackage 操作,需要 PolyBase。 以下查询可用于检查 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)
可能需要启用 PolyBase 或 PolyBase 导出。 在 Azure SQL 托管实例上启用 PolyBase 需要 PowerShell 或 Azure CLI。 在进行配置更改之前,应评估是否适合你的环境启用 PolyBase。
表和数据类型
Parquet 文件支持大多数数据类型用于进行提取和发布操作。 不支持数据类型的表将导致该表的数据被导出到 .dacpac
文件,而不是以 Parquet 格式导出。 支持以下数据类型,并将其写入 Azure Blob 存储中的 Parquet 文件:
- char
- varchar
- nchar
- nvarchar
- text
- ntext
- 十进制
- numeric
- 浮点
- 真实
- bit
- tinyint
- smallint
- int
- bigint
- smallmoney
- money
- smalldate
- smalldatetime
- 日期
- datetime
- datetime2
- datetimeoffset
- time
- uniqueidentifier
- 时间戳
- rowversion
- 二元
- varbinary
- 图像
- xml
- json
- 矢量
对 Parquet 文件的提取和发布操作启用了账本表。
使用 Always Encrypted 存储的数据不支持使用 Parquet 文件提取和发布操作。
可以使用 T-SQL 检查数据库,以检测写入 .dacpac
文件中(而不是直接写入 Azure Blob 存储的 Parquet 文件中)的数据类型。 以下示例查询返回一个结果集,其中包含不支持写入 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',
'tinyint',
'smallint',
'int',
'bigint',
'bit',
'money',
'smallmoney',
'uniqueidentifier',
'timestamp',
'rowversion',
'text',
'ntext',
'image',
'xml',
'json',
'vector'
);