如何在Python3 Jupyter Notebook中读写Azure Blob存储的Parquet文件?
在Jupyter Notebook(Python3)中读写Azure Blob存储的Parquet文件
我来帮你解决这个问题——你遇到的编码错误本质是因为Parquet是二进制格式的文件,而get_blob_to_text()是专门用来读取文本类文件的,直接用它处理Parquet肯定会触发解码失败。下面给你一套完整的、经过验证的实现方案,包含读取和写入两种场景,同时推荐使用Azure存储SDK的最新版本(旧版BlockBlobService已被弃用)。
准备工作:安装依赖库
首先确保你的环境里安装了必要的包,在Jupyter的单元格里运行:
!pip install azure-storage-blob pandas pyarrow
azure-storage-blob:Azure Blob存储的官方SDK(最新版)pandas:用来处理Parquet数据的常用工具pyarrow:Parquet格式的底层处理引擎(也可以用fastparquet,二选一即可)
方案1:使用pandas + Azure Blob SDK(推荐)
读取Parquet文件到DataFrame
from azure.storage.blob import BlobServiceClient import pandas as pd # 初始化Blob服务客户端 connect_str = "DefaultEndpointsProtocol=https;AccountName=testdata;AccountKey=key-here;EndpointSuffix=core.windows.net" blob_service_client = BlobServiceClient.from_connection_string(connect_str) # 获取目标Blob的客户端 container_name = "mycontainer" blob_name = "testdata.parquet" blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name) # 下载Blob的二进制流,直接用pandas读取成DataFrame with blob_client.download_blob() as blob_stream: df = pd.read_parquet(blob_stream) # 查看数据 df.head()
将DataFrame写入Azure Blob为Parquet文件
from azure.storage.blob import BlobServiceClient import pandas as pd from io import BytesIO # 假设你已经有一个要写入的DataFrame df = pd.DataFrame({"col1": [1, 2, 3], "col2": ["a", "b", "c"]}) # 初始化Blob服务客户端 connect_str = "DefaultEndpointsProtocol=https;AccountName=testdata;AccountKey=key-here;EndpointSuffix=core.windows.net" blob_service_client = BlobServiceClient.from_connection_string(connect_str) # 获取目标Blob的客户端 container_name = "mycontainer" blob_name = "output_data.parquet" blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name) # 将DataFrame写入BytesIO二进制流 parquet_stream = BytesIO() df.to_parquet(parquet_stream, engine="pyarrow") parquet_stream.seek(0) # 重置流的指针到开头 # 上传流到Azure Blob blob_client.upload_blob(parquet_stream, overwrite=True)
方案2:使用pyarrow直接操作Azure Blob存储
如果你需要更底层的控制,可以用pyarrow的Azure文件系统集成:
import pyarrow.fs import pyarrow.parquet as pq # 初始化Azure文件系统 fs = pyarrow.fs.AzureFileSystem( account_name="testdata", account_key="key-here", protocol="https" ) # 读取Parquet文件 dataset = pq.ParquetDataset("mycontainer/testdata.parquet", filesystem=fs) df = dataset.read_pandas().to_pandas() # 写入Parquet文件 table = pyarrow.Table.from_pandas(df) pq.write_table(table, "mycontainer/output_data.parquet", filesystem=fs)
为什么你的原代码会报错?
你之前用的get_blob_to_text()方法会尝试把Blob的二进制内容按照默认编码(通常是UTF-8)解码成文本,但Parquet是二进制序列化格式,根本不是文本数据,所以必然会抛出编码相关的错误。必须用二进制流的方式来处理Parquet文件。
内容的提问来源于stack exchange,提问作者user1814008
相关产品推荐
相关产品推荐

