如何从Azure Blob存储读取Parquet文件的指定列/行?
解决方案
当然可以只读取Parquet文件的部分列或行,Polars本身就支持这类按需读取的功能,结合Azure Blob存储的特性还能进一步优化性能,下面是具体实现方式:
一、读取部分列
Polars的pl.read_parquet()方法提供了columns参数,直接传入需要的列名列表即可,即使是从io.BytesIO读取文件,也只会解析并加载指定列的数据:
import polars as pl from io import BytesIO from azure.storage.blob import BlobClient # 初始化Blob客户端 blob_client = BlobClient.from_connection_string( "你的Azure存储连接字符串", container_name="目标容器名", blob_name="大型Parquet文件名.parquet" ) # 下载Blob数据到BytesIO blob_data = BytesIO(blob_client.download_blob().readall()) # 仅读取指定列 df = pl.read_parquet(blob_data, columns=["列名1", "列名2", "列名3"])
如果想进一步优化(避免下载整个文件),可以结合PyArrow的ParquetFile和Azure Blob的流式读取,利用Parquet的列存储特性,只读取目标列对应的字节范围:
import polars as pl import pyarrow.parquet as pq from azure.storage.blob import BlobClient blob_client = BlobClient.from_connection_string( "你的Azure存储连接字符串", container_name="目标容器名", blob_name="大型Parquet文件名.parquet" ) # 获取Blob的流式数据 blob_stream = blob_client.download_blob().chunks() # 用PyArrow打开Parquet文件,仅读取指定列 parquet_file = pq.ParquetFile(blob_stream) arrow_table = parquet_file.read(columns=["列名1", "列名2"]) # 转换为Polars DataFrame df = pl.from_arrow(arrow_table)
二、读取部分行
1. 读取前N行/跳过前N行
使用n_rows参数指定读取的行数,skip_rows参数指定跳过的行数:
# 读取前100行 df = pl.read_parquet(blob_data, n_rows=100) # 跳过前50行,读取接下来的200行 df = pl.read_parquet(blob_data, skip_rows=50, n_rows=200)
2. 条件过滤行(下推优化)
如果Parquet文件包含统计信息,Polars支持将过滤条件下推到读取阶段,减少需要加载的数据量,使用filter参数即可:
# 仅读取"列名1"大于100的行 df = pl.read_parquet(blob_data, filter=pl.col("列名1") > 100)
同样,上述行读取的逻辑也可以结合PyArrow的流式读取方式,避免下载整个文件。
内容的提问来源于stack exchange,提问作者MYK
相关产品推荐
相关产品推荐

