如何将Polars DataFrame直接以Parquet格式写入S3存储桶?
直接将Polars DataFrame以Parquet格式写入S3的方案
方法1:通过s3fs直接写入(推荐,简单高效)
Polars支持与fsspec兼容的文件系统,s3fs是其中之一,无需手动处理流,直接指定S3路径即可完成写入。
- 安装依赖:
pip install polars s3fs
- 示例代码:
import polars as pl import s3fs # 初始化S3文件系统(若已通过环境变量/凭证文件配置AWS权限,可省略此步) s3_fs = s3fs.S3FileSystem(anon=False) # 构造测试DataFrame(替换为你的实际数据) df = pl.DataFrame({ "id": [1, 2, 3], "value": ["foo", "bar", "baz"] }) # 直接写入S3 df.write_parquet( path="s3://your-bucket-name/target/path/file.parquet", filesystem=s3_fs )
方法2:通过BytesIO流 + boto3上传(适合需精细控制上传参数的场景)
如果需要自定义S3上传的额外参数(如ACL、存储类别),可以先将DataFrame写入内存字节流,再通过boto3上传。
- 安装依赖:
pip install polars boto3
- 示例代码:
import polars as pl import boto3 from io import BytesIO # 初始化S3客户端 s3_client = boto3.client("s3") # 你的DataFrame df = pl.DataFrame({ "id": [1, 2, 3], "value": ["foo", "bar", "baz"] }) # 将DataFrame写入内存缓冲区 buffer = BytesIO() df.write_parquet(buffer) buffer.seek(0) # 重置流指针至起始位置 # 上传至S3,可添加自定义参数 s3_client.upload_fileobj( Fileobj=buffer, Bucket="your-bucket-name", Key="target/path/file.parquet", ExtraArgs={"ACL": "private", "StorageClass": "STANDARD_IA"} )
注意事项
- AWS凭证配置:确保已通过环境变量(
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)、~/.aws/credentials文件,或IAM角色(AWS服务内运行时)配置好合法的S3访问权限。 - 大数据场景:若DataFrame体积较大,优先选择方法1,因为s3fs支持分块写入,避免内存溢出;方法2会将整个文件加载到内存,仅适合中小数据量。
- Polars版本:建议使用v0.18.0及以上版本,旧版本对fsspec的支持可能存在兼容性问题。
内容的提问来源于stack exchange,提问作者rnd om
相关产品推荐
相关产品推荐

