7个版本

0.2.2 2024年4月25日
0.2.1 2024年4月7日
0.2.0 2024年2月29日
0.1.3 2024年2月4日
0.1.1 2024年1月31日

#503WebAssembly

Download history 3877/week @ 2024-04-24 1981/week @ 2024-05-01 3000/week @ 2024-05-08 2834/week @ 2024-05-15 1501/week @ 2024-05-22 778/week @ 2024-05-29 844/week @ 2024-06-05 612/week @ 2024-06-12 535/week @ 2024-06-19 515/week @ 2024-06-26 757/week @ 2024-07-03 519/week @ 2024-07-10 443/week @ 2024-07-17 417/week @ 2024-07-24 437/week @ 2024-07-31 422/week @ 2024-08-07

每月1,886次下载

Apache-2.0

32KB
564

Apache Arrow的WebAssembly UDF

Crate Docs

对于不受信任的用户定义函数,您可以将其编译成WebAssembly并在沙箱环境中运行。

在WebAssembly中构建UDF

创建一个项目并在您的 Cargo.toml 中添加以下行

[dependencies]
arrow-udf = "0.1"

使用 #[function] 宏定义您的函数

use arrow_udf::function;

#[function("gcd(int, int) -> int")]
fn gcd(mut a: i32, mut b: i32) -> i32 {
    while b != 0 {
        (a, b) = (b, a % b);
    }
    a
}

然后编译项目到WebAssembly

cargo build --release --target wasm32-wasi

您可以在 target/wasm32-wasi/release/*.wasm 中找到生成的WebAssembly模块。

在WebAssembly中运行UDF

将以下行添加到您的 Cargo.toml

[dependencies]
arrow-udf-wasm = "0.1"

然后您可以加载WebAssembly模块并调用函数

use arrow_udf_wasm::Runtime;

// load the WebAssembly module
let binary = std::fs::read("udf.wasm").unwrap();
// create a runtime from the module
let runtime = Runtime::new(&binary).unwrap();
// list available functions in the module:
for name in runtime.functions() {
    println!("{}", name);
}
// call the function with a RecordBatch
let input: RecordBatch = ...;
let output = runtime.call("gcd(int4,int4)->int4", &input).unwrap();

WebAssembly运行时由 wasmtime 提供支持。请注意,每个WebAssembly实例只能运行单线程,我们内部维护一个实例池以支持来自多个线程的并行调用。

查看 示例 了解更多详细信息。要运行示例

cargo build --release -p arrow-udf-example --target wasm32-wasi
cargo run --example wasm -- target/wasm32-wasi/release/arrow_udf_example.wasm

在运行时构建WASM UDF

启用 build 功能以从源代码构建wasm二进制文件

[dependencies]
arrow-udf-wasm = { version = "0.1", features = ["build"] }

然后您可以在运行时构建WebAssembly模块

let manifest = r#"
[dependencies]
chrono = "0.4"
"#;

let script = r#"
use arrow_udf::function;

#[function("gcd(int, int) -> int")]
fn gcd(mut a: i32, mut b: i32) -> i32 {
    while b != 0 {
        (a, b) = (b, a % b);
    }
    a
}
"#;
let binary = arrow_udf_wasm::build::build(manifest, script).unwrap();

查看 build 模块以获取更多详细信息。

依赖关系

~25–36MB
~580K SLoC