如何在AWS Lambda中使用PyArrow读取S3中的Parquet文件?
在AWS Lambda中使用PyArrow读取S3上的Parquet文件
要在Lambda中实现读取S3存储的Parquet文件,按以下步骤操作:
1. 配置Lambda的IAM权限
Lambda执行角色必须具备S3对象读取权限,你可以:
- 为角色附加
AmazonS3ReadOnlyAccess托管策略(适合测试场景) - 或者创建更细粒度的自定义策略,仅允许对目标桶和文件执行
s3:GetObject操作,示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/path/to/your/*.parquet" } ] }
2. 准备Lambda的依赖包
Lambda默认环境不包含PyArrow和s3fs(PyArrow处理S3路径的依赖),你需要将这些依赖打包:
- 推荐使用Lambda层:在Amazon Linux 2环境下(或用Docker模拟)安装依赖,打包成zip后上传为Lambda层
- 也可以直接将依赖和代码打包成一个zip包上传到Lambda
3. 编写Lambda代码
PyArrow支持直接通过S3路径读取Parquet,无需先下载文件到本地,两种实现方式如下:
方式1:直接使用S3路径
import pyarrow.parquet as pq def lambda_handler(event, context): # 替换为你的S3文件路径 s3_file_path = "s3://your-bucket-name/path/to/target-file.parquet" # 读取Parquet文件为PyArrow Table pq_table = pq.read_table(source=s3_file_path) # 可选:转换为Pandas DataFrame进行后续处理 df = pq_table.to_pandas() return { "statusCode": 200, "body": f"成功读取Parquet文件,共{pq_table.num_rows}行数据" }
方式2:显式使用S3FileSystem
如果需要更灵活的S3配置(比如自定义端点、临时凭证等),可以显式初始化S3FileSystem:
import pyarrow.parquet as pq from pyarrow.fs import S3FileSystem def lambda_handler(event, context): bucket_name = "your-bucket-name" file_key = "path/to/target-file.parquet" fs = S3FileSystem() # 通过文件键和存储桶读取 pq_table = pq.read_table(source=file_key, filesystem=fs, storage_options={"bucket": bucket_name}) return { "statusCode": 200, "body": f"成功读取Parquet文件,共{pq_table.num_rows}行数据" }
注意事项
- 依赖兼容性:打包依赖时必须基于Lambda运行环境(Amazon Linux 2),否则会出现导入错误
- 路径正确性:S3路径格式为
s3://bucket-name/object-key,注意不要包含多余的斜杠或空格 - 权限排查:如果出现AccessDenied错误,先检查Lambda角色的权限是否覆盖目标S3对象,以及对象是否有公共访问限制
内容的提问来源于stack exchange,提问作者Ludwig
相关产品推荐
相关产品推荐

