WebAssembly UDF for Apache Arrow
For untrusted user-defined functions, you can compile them into WebAssembly and run them in a sandboxed environment.
Build UDF in WebAssembly
Create a project and add the following lines to your Cargo.toml:
[]
= "0.6"
Define your functions with the #[function] macro:
use function;
Then compile the project into WebAssembly:
You can find the generated WebAssembly module in target/wasm32-wasip1/release/*.wasm.
Run UDF in WebAssembly
Add the following lines to your Cargo.toml:
[]
= "0.5"
You can then load the WebAssembly module and call the functions:
use Runtime;
use DataType;
use RecordBatch;
// load the WebAssembly module
let binary = read.unwrap;
// create a runtime from the module
let runtime = new.unwrap;
// list available functions in the module:
for name in runtime.functions
// call the function with a RecordBatch
let func = runtime.find_function.unwrap;
let input: RecordBatch = ...;
let output = runtime.call.unwrap;
The WebAssembly runtime is powered by Wasmtime. Notice that each WebAssembly instance can only run single-threaded, we maintain an instance pool internally to support parallel calls from multiple threads.
See the example for more details. To run the example:
Build WASM UDF at Runtime
Enable the build feature to build the wasm binary from source:
[]
= { = "0.5", = ["build"] }
You can then build the WebAssembly module at runtime:
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 = build.unwrap;
See the [build] module for more details.