You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:12:07