使用PyArrow读取GCS指定分区Parquet文件转Pandas DataFrame报错
解决PyArrow读取GCS指定Parquet分区报错的问题
问题分析
直接传递分区路径列表给pyarrow.dataset.dataset时,因路径格式或分区解析逻辑问题,导致无法正确识别GCS上的有效路径。
解决方案
方法一:根路径+分区过滤(推荐)
利用PyArrow的分区过滤功能,指定数据集根路径后筛选目标分区,更符合PyArrow处理分区数据集的设计逻辑,效率更高且不易出错。
import pyarrow.dataset as ds import pyarrow.fs as fs import pandas as pd # 初始化GCS文件系统(确保已完成GCS认证配置) gs = fs.GcsFileSystem() # 指定数据集根路径(不含分区子路径) root_path = "bucket/Stage/Adapted/MX/Retail/SALES" # 创建数据集,明确指定Hive风格分区格式 dataset = ds.dataset( root_path, filesystem=gs, format="parquet", partitioning="hive" ) # 筛选需要的fiscal_week分区 filter_expr = ds.field("fiscal_week").isin(["202349", "202350", "202351"]) table = dataset.to_table(filter=filter_expr) # 转换为Pandas DataFrame df = table.to_pandas()
方法二:修正路径列表格式
若坚持使用路径列表,需移除路径末尾的斜杠,并明确指定分区格式,让PyArrow正确解析分区信息。
import pyarrow.dataset as ds import pyarrow.fs as fs import pandas as pd gs = fs.GcsFileSystem() # 移除路径末尾的斜杠,确保路径格式正确 partitioned_paths = [ 'bucket/Stage/Adapted/MX/Retail/SALES/fiscal_week=202349', 'bucket/Stage/Adapted/MX/Retail/SALES/fiscal_week=202350', 'bucket/Stage/Adapted/MX/Retail/SALES/fiscal_week=202351' ] # 创建数据集,指定格式和分区类型 dataset = ds.dataset( partitioned_paths, filesystem=gs, format="parquet", partitioning="hive" ) # 读取数据并转换为DataFrame table = dataset.to_table() df = table.to_pandas()
注意事项
- 确保已完成GCS认证配置(如环境变量设置、服务账号密钥加载等),否则即使路径存在也可能触发权限类的路径找不到错误。
- 优先使用方法一,因为PyArrow会自动处理分区元数据,无需手动维护路径列表,扩展性更强。
内容的提问来源于stack exchange,提问作者Tom J Muthirenthi
相关产品推荐
相关产品推荐

