在azure ml中运行笔记本时,如何最好地将azure blob csv格式转换为pandas数据帧

ran*_*.me 7 python azure azure-storage-blobs pandas azure-machine-learning-studio

我有一些大的csv(制表符分隔)数据存储为azure blob,我想从这些创建一个pandas数据帧.我可以在本地做到如下:

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')
Run Code Online (Sandbox Code Playgroud)

但是,当在azure ML笔记本上运行笔记本时,我无法"保存本地副本"然后从csv读取,所以我想直接进行转换(类似于pd.read_azure_blob(blob_csv)或只是pd .read_csv(blob_csv)将是理想的).

我可以获得所需的最终结果(blob csv数据的pandas数据帧),如果我首先创建一个azure ML工作区,然后将数据集读入其中,最后使用https://github.com/Azure/Azure-MachineLearning -ClientLibrary-Python以数据集的形式访问数据集,但我更喜欢直接从blob存储位置读取数据集.

hui*_*hen 14

接受的答案在最新的 Azure 存储 SDK 中不起作用。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()))
Run Code Online (Sandbox Code Playgroud)


max*_*moo 8

我想你想使用get_blob_to_bytesor get_blob_to_text; 这些应该输出一个字符串,您可以使用它来创建一个数据框

from io import StringIO
blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME)
df = pd.read_csv(StringIO(blobstring))
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用。它给出错误“ TypeError:initial_value必须为str或None,而不是Blob”。如果在此解决方案中添加`.content`,它将起作用:`blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME).content` (3认同)

Dat*_*med 6

简单回答:

Working as on 12th June 2022

以下是将 CSV 文件从 Azure Blob 读取到 Jupyter 笔记本数据帧 (python) 的步骤。

步骤 1: 首先通过右键单击 blob/存储 CSV 文件(blob 文件),为 Azure 存储上的目标 CSV(blob)文件生成 SAS 令牌和 URL。 在此输入图像描述

步骤 2:复制Blob SAS URL用于生成 SAS 令牌和 URL 的按钮下方显示的 。

步骤 3:在 Jupyter 记事本中使用以下代码行导入所需的 CSV。将值替换url为您Blob SAS URL在上述步骤中复制的值。

import pandas as pd 
url ='Your Blob SAS URL'
df = pd.read_csv(url)
df.head()
Run Code Online (Sandbox Code Playgroud)


小智 5

感谢您的回答,我认为需要进行一些更正。您需要从blob对象获取内容,并且在get_blob_to_text中不需要本地文件名。

from io import StringIO
blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME).content
df = pd.read_csv(StringIO(blobstring))
Run Code Online (Sandbox Code Playgroud)