5个版本 (主要破坏性更新)
52.0.0 | 2024年7月13日 |
---|---|
51.0.0 | 2024年4月11日 |
50.0.0 | 2024年1月18日 |
49.0.0 | 2023年11月28日 |
48.0.1 | 2023年11月28日 |
#91 in FFI
每月117次下载
28KB
374 行
arrow_extendr
arrow-extendr是一个crate,它促进了Apache Arrow内存在R和Rust之间的传输。它利用extendr,R包中的{nanoarrow}
,以及arrow-rs。
版本控制
目前,arrow-rs的版本之间不兼容。这意味着如果你的crate使用arrow-rs版本48.0.1
,那么arrow-extendr也必须使用相同的版本。因此,arrow-extendr使用与arrow-rs相同的版本,以便易于匹配所需的版本。
版本:
- 52.0.0
- 51.0.0
- 50.0.0(与geoarrow-rs 0.1.0兼容)
- 49.0.0-geoarrow(不在crates.io上可用,但当前是Git版本)
- 48.0.1
- 49.0.0
激励示例
假设我们有以下DBI
连接,我们将使用arrow向其发送请求。使用dbGetQueryArrow()
的结果是nanoarrow_array_stream
。我们希望使用Rust计算流中每批次的行数。
# adapted from https://github.com/r-dbi/DBI/blob/main/vignettes/DBI-arrow.Rmd
library(DBI)
con <- dbConnect(RSQLite::SQLite())
data <- data.frame(
a = runif(10000, 0, 10),
b = rnorm(10000, 4.5),
c = sample(letters, 10000, TRUE)
)
dbWriteTable(con, "tbl", data)
我们可以编写一个extendr函数,它从一个&Robj
创建一个ArrowArrayStreamReader
。在函数中,我们实例化一个计数器来跟踪每个块中的行数。对于每个块,我们打印行数。
use extendr_api::prelude::*;
use arrow_extendr::from::FromArrowRobj;
use arrow::ffi_stream::ArrowArrayStreamReader;
#[extendr]
/// @export
fn process_stream(stream: Robj) -> i32 {
let rb = ArrowArrayStreamReader::from_arrow_robj(&stream)
.unwrap();
let mut n = 0;
rprintln!("Processing `ArrowArrayStreamReader`...");
for chunk in rb {
let chunk_rows = chunk.unwrap().num_rows();
rprintln!("Found {chunk_rows} rows");
n += chunk_rows as i32;
}
n
}
使用此函数,我们可以在dbGetQueryArrow()
的输出或其他与Arrow相关的DBI函数上使用它。
query <- dbGetQueryArrow(con, "SELECT * FROM tbl WHERE a < 3")
process_stream(query)
#> Processing `ArrowArrayStreamReader`...
#> Found 256 rows
#> Found 256 rows
#> Found 256 rows
#> ... truncated ...
#> Found 256 rows
#> Found 256 rows
#> Found 143 rows
#> [1] 2959
在包中使用arrow-extendr
要在R包中使用arrow-extendr,首先创建一个R包,并使用以下命令将其转换为extendr包
usethis::create_package("my_package")
rextendr::use_extendr();
接下来,您需要确保 nanoarrow
是包的依赖项,因为 arrow-extendr 将会调用 nanoarrow 的函数来实现 R 和 Arrow 内存之间的转换。为此,请运行 usethis::use_package("nanoarrow")
将其添加到您的 DESCRIPTION 文件的 Imports 字段中。
依赖项
~17–24MB
~375K SLoC