#arrow #extendr #rstats

arrow_extendr

通过extendr和nanoarrow使R能够使用arrow-rs

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

Download history 161/week @ 2024-04-08 2/week @ 2024-04-15 3/week @ 2024-05-20 4/week @ 2024-06-03 1/week @ 2024-06-10 99/week @ 2024-07-08 14/week @ 2024-07-15 4/week @ 2024-07-22

每月117次下载

MIT/Apache

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