如何从数据集或数据表上传到 Azure Blob

How to upload to azure blob from a dataset or a datatable

我目前在 Powershell 工作,试图从我的 Azure SQL Database 获取一些数据。我已经成功地将一些数据提取到数据集中。但是,我似乎无法弄清楚如何在不先将其保存为 csv 的情况下将其上传到 Azure blob storage

The dataset must be converted to csv and uploaded to the blob as a csv without saving it locally.

这是到目前为止的结果:

$SQLServer = "xxxxxxx"
$SQLDBName = "xxxxxx"
$uid ="xxxxxxxx"
$pwd = "xxxxxxx"
$SqlQuery = "SELECT * from Dim.xxxxxx;"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = False; User ID = $uid; Password = $pwd;"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)

$csv = $DataSet.Tables[0] | ConvertTo-Csv -Delimiter ";" -NoTypeInformation

Set-AzStorageBlobContent -File $csv -Context $context -Container "xxxxxx"

但是最后一行给我这个错误:

Set-AzStorageBlobContent : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'File'. Specified method is not supported.

我知道我做错了什么,但我不知道如何转换数据集并同时上传它。或者也许还有其他方法?

根据 Set-AzStorageBlobContent 的文档,这是不可能的:

The Set-AzStorageBlobContent cmdlet uploads a local file to an Azure Storage blob.

来源:https://docs.microsoft.com/en-us/powershell/module/az.storage/set-azstorageblobcontent?view=azps-2.8.0

您收到该错误消息的原因是因为该命令需要一个文件名,作为字符串,作为 -File 参数的值,而不是 blob 的内容。即使您将 Object[] 转换为字符串,它仍然无法工作,因为该命令将尝试查找具有该路径的文件。

我建议您使用 Blob 存储 REST API 来实现这一点,尤其是 Put Blob method。您将必须制作一个 HTTP 请求。

另一种选择是使用 Blob Storage .NET API,因为您可以从 Powershell 使用 .NET 类。

让 Databricks 管理它。 Databricks 的 SQL 数据仓库连接器将管理中间存储。只需加载您的数据框,然后使用 DW 连接器写入 DW。

https://docs.databricks.com/data/data-sources/azure/sql-data-warehouse.html

我找到的解决方案是在 Powershell 中创建一个临时文件。

首先,我用 New-TemporaryFile. 声明一个变量,然后我将 DataSet 导出到 $file 变量。完成后,我可以将其上传到我的 Azure Blob Storage.

所以解决方案是:

$file = New-TemporaryFile
$DataSet.Tables[0] | Export-Csv -Path $file -Delimiter ";" -NoTypeInformation

Set-AzStorageBlobContent -File $file -Container "xxxxxx" -Context $context -blob "dataset" -Force