Как лучше всего конвертировать из формата Azure Blob CSV в Pandas DataFrame при работе ноутбука в Azure мл

У меня есть несколько больших данных CSV (с разделителями табуляции), которые хранятся в виде голубых блобов, и я хочу создать из них панду. Я могу сделать это локально следующим образом:

from azure.storage.blob import BlobService
import pandas as pd
import os.path

STORAGEACCOUNTNAME= 'account_name'
STORAGEACCOUNTKEY= "key"
LOCALFILENAME= 'path/to.csv'        
CONTAINERNAME= 'container_name'
BLOBNAME= 'bloby_data/000000_0'

blob_service = BlobService(account_name=STORAGEACCOUNTNAME, account_key=STORAGEACCOUNTKEY)

# Only get a local copy if haven't already got it
if not os.path.isfile(LOCALFILENAME):
    blob_service.get_blob_to_path(CONTAINERNAME,BLOBNAME,LOCALFILENAME)

df_customer = pd.read_csv(LOCALFILENAME, sep='\t')

Однако, когда я запускаю записную книжку на ноутбуках Azure ML, я не могу "сохранить локальную копию", а затем прочитать из csv, и поэтому я хотел бы сделать преобразование напрямую (что-то вроде pd.read_azure_blob(blob_csv) или просто pd.read_csv(blob_csv) было бы идеально).

Я могу получить желаемый конечный результат (pandas dataframe для данных BLOB-объектов CSV), если сначала создам рабочую область Azure ML, а затем зачитываю в нее наборы данных и, наконец, использую https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python для доступа к набору данных как к пандам, но я бы предпочел просто читать прямо из хранилища больших двоичных объектов.

5 ответов

Решение

Я думаю, что вы хотите использовать get_blob_to_bytes, or get_blob_to_text; они должны вывести строку, которую вы можете использовать для создания

from io import StringIO
blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME,LOCALFILENAME)
df = pd.read_csv(StringIO(blobstring))

Принятый ответ не будет работать в последней версии пакета SDK службы хранилища Azure. MS полностью переписала SDK. Это немного раздражает, если вы используете старую версию и обновляете ее. Приведенный ниже код должен работать в новой версии.

from azure.storage.blob import ContainerClient
from io import StringIO
import pandas as pd

conn_str = ""
container = ""
blob_name = ""

container_client = ContainerClient.from_connection_string(
    conn_str=conn_str, 
    container_name=container
    )
# Download blob as StorageStreamDownloader object (stored in memory)
downloaded_blob = container_client.download_blob(blob_name)

df = pd.read_csv(StringIO(downloaded_blob.content_as_text()))

Спасибо за ответ, я думаю, что некоторая коррекция необходима. Необходимо получить содержимое из объекта blob, а в get_blob_to_text нет необходимости в локальном имени файла.

из io import StringIO blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME).content df = pd.read_csv(StringIO(blobstring))

Простой ответ:

Working as on 20th Sep 2020

Ниже приведены инструкции по чтению файла CSV из BLOB-объекта Azure в фреймворк записной книжки Jupyter (python).

ШАГ 1. Сначала сгенерируйте токен SAS и URL-адрес для целевого файла CSV(большого двоичного объекта) в хранилище Azure, щелкнув правой кнопкой мыши файл CSV большого двоичного объекта / хранилища (файл большого двоичного объекта).

ШАГ 2: Скопируйте Blob SASURL который отображается под кнопкой, используемой для создания токена SAS и URL-адреса.

ШАГ 3. Используйте приведенную ниже строку кода в своем блокноте Jupyter, чтобы импортировать нужный CSV. Заменить url ценность с вашим Blob SASURL скопировано на шаге выше.

       import pandas as pd 
url ='Your Blob SASURL'
df = pd.read_csv(url)
df.head()

Используйте ADLFS ( pip install adlfs), который является API-интерфейсом, совместимым с fsspec, для Azure Lakes (gen1 и gen2):

      storage_options = {
    'tenant_id': tenant_id,
    'account_name': account_name,
    'client_id': client_id,
    'client_secret': client_secret
}

url = 'az://some/path.csv'
pd.read_csv(url, storage_options=storage_options)