Rust中从Digital Ocean S3加载Parquet到Polars的CloudOptions编译错误
解决方案
针对你在Polars 0.28.0中无法使用CloudOptions::from_untyped_config以及加载Digital Ocean Spaces(S3兼容)中Parquet文件的问题,提供以下两种可行方案:
方案一:Polars Cloud模块手动构造CloudOptions(适配0.28.0)
Polars 0.28.0尚未引入from_untyped_config方法,需基于object_store库手动构造S3存储后端并传入CloudOptions。
步骤1:配置Cargo依赖
确保Polars启用所需feature:
[dependencies] polars = { version = "0.28.0", features = ["cloud", "parquet", "lazy", "object_store"] } object_store = { version = "0.6", features = ["aws"] }
步骤2:代码实现
use polars::prelude::*; use object_store::{aws::AmazonS3Builder, ObjectStore}; use std::sync::Arc; fn main() -> PolarsResult<()> { // 初始化Digital Ocean Spaces存储后端 let s3_store = AmazonS3Builder::new() .with_region("nyc3") // 替换为你的DO区域(如sfo3、ams3等) .with_endpoint("https://nyc3.digitaloceanspaces.com") // 对应区域的DO Spaces endpoint .with_access_key_id("你的DO访问密钥ID") .with_secret_access_key("你的DO访问密钥") .build()?; // 构造CloudOptions let cloud_options = CloudOptions { store: Arc::new(s3_store), path: "你的存储桶名称/parquet文件路径".into(), }; // 加载为DataFrame let df = ParquetReader::new_cloud(cloud_options.clone()).finish()?; println!("DataFrame预览:\n{}", df); // 后续切换为LazyFrame let lf = LazyFrame::scan_parquet_cloud(cloud_options, Default::default())?; let lazy_result = lf.collect()?; println!("LazyFrame结果:\n{}", lazy_result); Ok(()) }
方案二:结合rust-s3与Polars流读取
既然你已通过rust-s3成功访问存储,可直接获取文件字节流,无需下载到本地,再传入Polars的Parquet读取器。
步骤1:确保依赖
[dependencies] polars = { version = "0.28.0", features = ["parquet", "lazy"] } s3 = "0.33.0"
步骤2:代码实现
use polars::prelude::*; use s3::{Bucket, Region, creds::Credentials}; use std::io::Cursor; fn main() -> PolarsResult<()> { // 初始化DO Spaces桶 let do_region = Region::Custom { region: "nyc3".to_string(), // 你的DO区域 endpoint: "https://nyc3.digitaloceanspaces.com".to_string(), }; let bucket = Bucket::new( "你的存储桶名称", do_region, Credentials::new( Some("你的DO访问密钥ID"), Some("你的DO访问密钥"), None, None, None, )? )?; // 获取远程文件字节流 let (file_bytes, _) = bucket.get_object("parquet文件路径").unwrap(); let cursor = Cursor::new(file_bytes); // 加载为DataFrame let df = ParquetReader::new(cursor).finish()?; println!("DataFrame预览:\n{}", df); Ok(()) }
可选:升级Polars版本简化配置
若允许升级Polars到0.29.0及以上版本,可使用CloudOptions::from_untyped_config方法,通过键值对快速配置S3兼容存储:
use polars::prelude::*; use std::collections::HashMap; fn main() -> PolarsResult<()> { let config = HashMap::from([ ("aws_access_key_id", "你的DO访问密钥ID"), ("aws_secret_access_key", "你的DO访问密钥"), ("aws_region", "nyc3"), ("aws_endpoint", "https://nyc3.digitaloceanspaces.com"), ]); let cloud_options = CloudOptions::from_untyped_config("你的存储桶名称/parquet文件路径", config)?; let df = ParquetReader::new_cloud(cloud_options).finish()?; println!("{}", df); Ok(()) }
关键注意事项
- Digital Ocean Spaces属于S3兼容存储,必须指定对应区域的
endpoint,不能使用AWS默认端点 - 若使用LazyFrame,方案一的Cloud模块方式更适配,无需将整个文件加载到内存即可实现懒加载
内容的提问来源于stack exchange,提问作者gxmw
相关产品推荐
相关产品推荐

