Как лучше всего конвертировать из формата 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)