Rust UDF 开发
炎凰数据平台为用户提供了以 Rust 为编程语言的自定义标量函数的方法,并提供了一些用例作为默认内置的 Rust UDF gandiva_rust_udf。下面将介绍如何由用户自己添加自定义的标量函数。
开发环境
- rustc: 1.71.1
- platform: linux
开发步骤
- 创建一个cargo的项目
cargo new my_rust_udf --lib
- 在
my_rust_udf
中创建一个子项目
cargo new add_one_func --lib
- 更新
my_rust_udf/Cargo.toml
如下
# in my_rust_udf/Cargo.toml
[package]
name = "my_rust_udf"
version = "0.0.1"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[workspace]
members = [
"udf_registry",
"add_one_func",
]
resolver = "2"
[workspace.dependencies]
libc = "0.2.152"
gandiva_rust_udf_macro = { version = "0.1.4" }
gandiva_rust_udf_shared = { version = "0.1.5" }
- 更新
my_rust_udf/add_one_func/Cargo.toml
如下
# in my_rust_udf/add_one_func/Cargo.toml
[package]
name = "add_one_func"
version = "0.0.1"
edition = "2021"
[lib]
name = "add_one_func"
path = "src/lib.rs"
[dependencies]
# if your function requires string as parameters or return value, you should add libc as a dependency
libc = { workspace = true }
gandiva_rust_udf_macro = { workspace = true }
gandiva_rust_udf_shared = { workspace = true }
- 在
gandiva_rust_udf/add_one_func/src/lib.rs
中实现 UDF 功能,如下为例
use gandiva_rust_udf_macro::udf;
#[udf]
fn add_one(x: i64) -> i64 {
x + 1
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add_one() {
let result = add_one(6);
assert_eq!(result, 7);
}
}
- 安装
gandiva_rust_udf_build
以用来生成项目udf_registry
cargo install gandiva_rust_udf_build
- 回到主项目
my_rust_udf
的根目录,运行下列指令生成子目录udf_registry
gen-udf-reg
- 编译主项目并得到对应的动态链接文件
my_rust_udf/target/<target_value>/release/libmy_rust_udf.so
# <target_value> options: x86_64-unknown-linux-gnu | aarch64-unknown-linux-gnu
cargo build --lib --release --workspace --target <target_value>
- 将生成的动态链接文件放到
${STONEWAVE_HOME}/var/scalar_funcs
- 重启 stonewave searcher
- 使用示例
select add_one(6)
add_one(6) |
---|
7 |