包含 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)
可能需要启用 Polybase 或 Polybase 导出。 在 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'
)
后续步骤
- 详细了解提取
- 详细了解发布
- 详细了解 Azure Blob 存储
- 详细了解 Azure 存储共享访问签名 (SAS)
- 详细了解 Azure 存储帐户密钥