Как загрузить в Azure BLOB из набора данных или таблицы данных - PullRequest
0 голосов
/ 30 октября 2019

Я сейчас работаю в Powershell, пытаясь получить некоторые данные из моего Azure SQL Database. Я с успехом извлек некоторые данные в набор данных. Тем не менее, я не могу понять, как загрузить его в Azure blob storage, не сохранив его сначала локально как CSV.

Набор данных должен быть преобразован в CSV и загружен в BLOB как CSV безсохраняя его локально.

Это то, что получилось до сих пор:

$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: Невозможно преобразовать System.Object [] в тип System.String, требуемый параметром File. Указанный метод не поддерживается.

Я знаю, что делаю что-то не так, но не могу понять, как преобразовать набор данных и загрузить его одновременно. А может, есть другой способ?

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Просто позвольте Databricks управлять этим. Соединитель хранилища данных SQL для блоков данных будет управлять промежуточным хранилищем. Просто загрузите ваш фрейм данных, а затем запишите в DW с помощью коннектора DW.

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

1 голос
/ 30 октября 2019

Согласно документации для Set-AzStorageBlobContent это невозможно:

Командлет Set-AzStorageBlobContent загружает локальный файл в большой двоичный объект хранилища Azure.

Источник: https://docs.microsoft.com/en-us/powershell/module/az.storage/set-azstorageblobcontent?view=azps-2.8.0

Причина, по которой вы получаете это сообщение об ошибке, заключается в том, что команда ожидает имя файла в виде строки в качестве значения параметра -File, а не содержимое большого двоичного объекта. Даже если вы преобразуете объект [] в строку, он все равно не будет работать, поскольку команда попытается найти файл с этим путем.

Я рекомендую вам использовать API REST Blob Storage для достижения этой цели, в частности метод Put Blob . Вам нужно будет создать запрос HTTP.

Другой вариант - использовать API хранилища BLOB-объектов .NET , поскольку вы можете использовать классы .NET из Powershell.

0 голосов
/ 30 октября 2019

Решение, которое я нашел, состояло в том, чтобы вместо этого создать временный файл в 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
...