如何最好地将 azure blob csv 格式转换为 pandas dataframe 而 运行 notebook in azure ml

How best to convert from azure blob csv format to pandas dataframe while running notebook in azure ml

我有许多存储为天蓝色 blob 的大型 csv(制表符分隔)数据,我想从这些数据中创建一个 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')

然而,当 运行 Azure ML notebooks 上的笔记本时,我无法 'save a local copy' 然后从 csv 读取,所以我想直接进行转换(类似于 pd.read_azure_blob(blob_csv) 或只是 pd.read_csv(blob_csv) 将是理想的)。

如果我首先创建一个 azure ML 工作区,然后将数据集读入其中,最后使用 https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python 以 pandas 数据帧的形式访问数据集,但我更愿意直接从 blob 存储位置读取。

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

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

感谢您的回答,我认为需要进行一些更正。您需要从 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))

已接受的答案不适用于最新的 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()))

简单答案:

Working as on 20th Sep 2020

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

第 1 步: 首先通过 right-clicking blob/storage CSV 文件(blob 文件)为 Azure-storage 上的目标 CSV(blob)文件生成一个 SAS 令牌 & URL。

第 2 步: 复制出现在用于生成 SAS 令牌的按钮下方的 Blob SAS URL 和 URL.

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

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

使用 ADLFS (pip install adlfs),它与 ​​fsspec 兼容 API 适用于 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)