我有一个 axum 服务器需要从 S3 扫描一些 parquet 文件。当一切都同步时,效果很好:
pub fn lazyframe_from_s3_key(key: &str) -> Result<LazyFrame> {
let access_key_id = std::env::var("aws_access_key_id")?;
let secret_access_key = std::env::var("aws_secret_access_key")?;
let region = std::env::var("aws_region")?;
let cloud_options = cloud::CloudOptions::default().with_aws([
(Key::AccessKeyId, access_key_id),
(Key::SecretAccessKey, secret_access_key),
(Key::Region, region),
]);
let mut args = ScanArgsParquet::default();
args.cloud_options = Some(cloud_options);
let df = LazyFrame::scan_parquet(key, args)?
.with_streaming(true)
.select([all()]);
Ok(df)
}
但是,一旦我将其设为异步并尝试从 tokio 管理的异步函数调用它,我就会收到“无法从运行时内启动运行时”错误,因为 scan_parquet 调用 block_on。有什么办法可以解决这个问题吗?
我得出的结论是,没有办法以异步方式干净利落地与极坐标交互,并且每次调用使用并行性的极坐标函数时,都必须求助于 tokio::task::spawn_blocking 。