rust - 将非 Future Rust 函数变成 Future 函数?
问题描述
我继承了一个 Rust 应用程序,我希望对其进行一些小的修改。目前,它使用 Futures 通过以下方式从 Cassandra 中检索记录:
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Item {
pub a: String,
pub b: f64,
}
#[derive(Debug)]
pub enum DataSetError {
CassandraError(cassandra_cpp::Error),
}
pub type Result<T> = std::result::Result<T, DataSetError>;
pub fn select_cass_items(
session: &Session,
a: String,
) -> impl Future<Output = Result<Vec<Item>>> + Unpin {
let table = envmnt::get_or("TABLE", "ab_table");
let mut statement = stmt!(&("SELECT a, b FROM ".to_owned() + &table + " WHERE a = ?"));
statement.bind(0, a).unwrap();
session.execute(&statement).map(|result| {
result
.map(|rows| {
rows.iter()
.map(|row| Item {
a: row.get_by_name("a").unwrap(),
b: row.get_by_name("b").unwrap(),
})
.collect()
})
.map_err(|e| {
warn!("[select_cass_items] {:?}", e);
DataSetError::CassandraError(e)
})
})
}
我想添加从 Parquet 文件中执行相同操作的选项。我编写了一个简单的非未来函数(如下),它执行与 Cassandra 函数等效的读取/过滤操作。我已经验证它按预期工作。
pub fn read_parquet_file (
a: String)
-> Vec<Item> {
let reader = SerializedFileReader::try_from("/path/to/file.parquet".to_string()).unwrap();
let iter = reader.get_row_iter(None).unwrap();
iter.filter_map(|row| {
if row.get_string(0).unwrap() == &a {
Some(Item {
a: row.get_string(0).unwrap().to_string(),
b: row.get_double(1).unwrap(),
})
}
else {
None
}
}).collect::<Vec<_>>()
}
问题是:如何将非 Future Parquet 函数转换为 Future Cassandra 函数的直接替代品?我看到cassandra_cpp板条箱支持 Futures,但parquet create 不支持。当然必须有办法做到这一点?但是,我是 Rust 新手,我找不到任何足够接近我希望能够将我的工作变成我需要的东西的例子。我尝试了各种东西,但它们都是死胡同,不值得分享。
谢谢!
解决方案
推荐阅读
- python - 使用 MNE python 加载实地考察数据的问题
- android - 生成签名的 apk 时文件上传失败,但是当应用程序处于调试状态时,文件正在上传到服务器
- css - 如果没有足够的空间,如何使网格 minmax 转到 1 列?
- admin - Magento 2.0 中基于 Store 的限制
- asp.net-core - 如何检索参与多对多关系的对象?
- java - 在对外部服务进行 http 调用之前排队多个请求 - spring webflux 和 projectreactor
- javascript - 是否有任何方法可以仅“传播”在 React 组件中传递的合成事件?
- angular - 反转 Angular 组件的 HTML
- c++ - 如何访问 std::vector
在qml? - jpeg - Exif TIFF 字段偏移未指向正确的值