在 AWS Lambda 中使用 Polars 云存储

问题描述 投票:0回答:1

我有一个用 Rust 编写的 AWS Lambda,使用 Rust Lambda 运行时。在该 Lambda 中,我想使用 Polars 从 S3 延迟加载 Parquet 文件并对其执行一些转换,然后再将其写回另一个 S3 存储桶。

我遇到的问题(至少,我认为这是问题所在)是 Polars Cloud Storage 实现似乎使用 tokio 的 block_on 方法,但 Lambda 运行时已经使用 tokio 运行程序,因此我收到以下错误:

Cannot start a runtime from within a runtime. This happens because a function (like `block_on`) attempted to block the current thread while the thread is being used to drive asynchronous tasks.

我用来延迟加载 Parquet 文件的代码如下:

let path = "s3://my_bucket/example.parquet"

let args = ScanArgsParquet::default();
match LazyFrame::scan_parquet(path, args) {
    Ok(lf) => lf,
    Err(_) => return Err(ReadError::ParquetError),
}

我对 Rust 比较陌生,所以我能做些什么来解决这个问题吗?或者我是否必须使用 SDK 自己将文件下载到内存中,然后加载它(以非惰性方式)?

amazon-web-services rust aws-lambda rust-tokio rust-polars
1个回答
0
投票

根据 @Chayim Friedman 对原始帖子的评论,这是我最终使用 tokio 的

task::spawn_blocking
:

let res = task::spawn_blocking(move || {
    let args = ScanArgsParquet::default();
    match LazyFrame::scan_parquet(path, args) {
        Ok(lf) => Ok(lf),
        Err(e) => Err(e),
    }
}).await;

match res {
    Ok(r) => match r {
        Ok(lf) => Ok(lf),
        Err(_) => Err(ReadError::ParquetError)
    },
    Err(_) => Err(ReadError::ThreadError)
}
© www.soinside.com 2019 - 2024. All rights reserved.