копирование azure blob в azure файловый ресурс с использованием Python SDK - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь скопировать большой двоичный объект из Azure контейнера больших двоичных объектов хранилища в общую папку, выполнив следующий сценарий на Azure Databricks

dbutils.library.installPyPI('azure-storage-blob')
dbutils.library.installPyPI('azure-storage-file-share')
from azure.storage.blob import BlobServiceClient, BlobClient
from azure.storage.fileshare import ShareClient, ShareFileClient

connection_string = my_connection_string

blobserviceclient = BlobServiceClient.from_connection_string(connection_string) 
source_blob = BlobClient(blobserviceclient.url,container_name = 'my-container-name', blob_name = 'my_file.json')

fileshareclient = ShareClient.from_connection_string(connection_string, 'my-fileshare-name')
destination_file= fileshareclient.get_file_client('my_file.json')

destination_file.start_copy_from_url(source_blob.url)

Я получаю следующую ошибку:

ResourceNotFoundError: The specified resource does not exist.

Когда я проверяю source_blob.url и destination_file.url, они оба существуют:

source_blob.url
'https://myaccountname.file.core.windows.net/my-container-name/my_file.json'

и

destination_file.url
'https://myaccountname.file.core.windows.net/my-fileshare-name/my_file.json'

Я использовал следующие примеры: https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/storage/azure-storage-file-share/samples/file_samples_client.py Есть идеи, что я делаю не так? Это работает, когда я использую AzCopy. Я также могу копировать из одного контейнера больших двоичных объектов в другой, но не из контейнера больших двоичных объектов в общую папку.

1 Ответ

0 голосов
/ 14 июля 2020

Вы должны использовать sasToken с URL-адресом большого двоичного объекта при использовании метода start_copy_from_url или , устанавливающего исходный контейнер большого двоичного объекта как publi c. В противном случае он выдаст ошибку, которую вы видели.

Для sasToken вы можете сгенерировать его из кода или из azure портала.

Вот пример кода, включая создание токена sas для blob:

from azure.storage.blob import BlobServiceClient, BlobClient, generate_blob_sas, BlobSasPermissions
from azure.storage.fileshare import ShareClient, ShareFileClient
from datetime import datetime, timedelta

connection_string="xxx"

blobserviceclient = BlobServiceClient.from_connection_string(connection_string)
source_blob = BlobClient(blobserviceclient.url,container_name="xxx", blob_name="xxx")

#generate sas token for this blob
sasToken = generate_blob_sas(
    account_name="xxx",
    container_name="xxx",
    blob_name="xxxx",
    account_key="xxx",
    permission= BlobSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=1)
)

fileshareclient =ShareClient.from_connection_string(connection_string,"xxx")
destination_file = fileshareclient.get_file_client('xxx')

destination_file.start_copy_from_url(source_blob.url+"?"+sasToken)

print("**copy completed**")
...