Skip to main content
Version: 2.15.0

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