Geopandas读取S3 Parquet文件遇ACCESS_DENIED问题求助
问题描述
将本地创建的GeoDataFrame对应的Parquet文件上传至S3后,在AWS Glue中执行以下代码尝试用geopandas读取:
import geopandas as gpd test_gdf = gpd.read_parquet("s3://bucket_name/key/file.parquet")
触发如下权限错误:
OSError: When getting information for key 'key/file.parquet' in bucket 'bucket_name': AWS Error ACCESS_DENIED during HeadObject operation: No response body.
但使用pandas的read_parquet方法却能成功读取:
import pandas as pd test_gdf = pd.read_parquet("s3://bucket_name/key/file.parquet")
由于将pandas读取结果转回GeoDataFrame耗时极长,希望直接用geopandas读取。已检查IAM角色权限(配置了s3:*操作允许)和S3桶策略,求可行解决方法。
解决方法
显式指定S3存储选项
geopandas底层的文件访问库可能未自动获取Glue角色的凭证,可通过s3fs显式初始化文件系统后传入:import geopandas as gpd from s3fs import S3FileSystem s3 = S3FileSystem(anon=False) test_gdf = gpd.read_parquet("s3://bucket_name/key/file.parquet", storage_options={"s3": s3})也可直接指定区域参数适配Glue环境:
test_gdf = gpd.read_parquet( "s3://bucket_name/key/file.parquet", storage_options={"client_kwargs": {"region_name": "你的AWS区域"}} )统一读取引擎
指定和pandas相同的pyarrow引擎,避免底层实现差异导致的权限逻辑问题:test_gdf = gpd.read_parquet("s3://bucket_name/key/file.parquet", engine="pyarrow")升级依赖版本
AWS Glue默认的pyarrow、fsspec版本可能和geopandas不兼容,导致S3访问异常。可在Glue作业的参数中添加额外依赖包:--additional-python-modules geopandas==0.14.0,pyarrow==14.0.0,fsspec==2023.10.0版本号可根据实际兼容情况调整。
确认本地导出格式
本地导出GeoDataFrame到Parquet时,使用pyarrow引擎确保几何列符合GeoParquet规范,避免读取时的额外处理:gdf.to_parquet("本地文件.parquet", engine="pyarrow")
内容的提问来源于stack exchange,提问作者Gi Yeon Shin
相关产品推荐
相关产品推荐

