8个版本

0.3.0 2024年4月25日
0.2.2 2024年4月2日
0.2.1 2024年2月29日
0.1.3 2024年2月18日
0.1.2 2024年1月31日

#93 in WebAssembly

Download history 799/week @ 2024-04-25 531/week @ 2024-05-02 636/week @ 2024-05-09 655/week @ 2024-05-16 674/week @ 2024-05-23 378/week @ 2024-05-30 338/week @ 2024-06-06 431/week @ 2024-06-13 289/week @ 2024-06-20 454/week @ 2024-06-27 469/week @ 2024-07-04 503/week @ 2024-07-11 290/week @ 2024-07-18 285/week @ 2024-07-25 320/week @ 2024-08-01 372/week @ 2024-08-08

1,356 每月下载量

Apache-2.0

29KB
415 代码行

Rust UDF for Apache Arrow

Crate Docs

用法

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

[dependencies]
arrow-udf = "0.2"

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

use arrow_udf::function;

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

该宏将生成一个接受 RecordBatch 作为输入并返回 RecordBatch 作为输出的函数。该函数可以由可选的 output 参数命名。如果未指定,它将被任意命名,例如 gcd_int4_int4_int4_eval

然后您可以在 RecordBatch 上调用生成的函数

let input: RecordBatch = ...;
let output: RecordBatch = eval_gcd(&input).unwrap();

如果您打印输入和输出批次,它将如下所示

 input     output
+----+----+-----+
| a  | b  | gcd |
+----+----+-----+
| 15 | 25 | 5   |
|    | 1  |     |
+----+----+-----+

可能失败的函数

如果您的函数返回一个 Result

use arrow_udf::function;

#[function("div(int, int) -> int", output = "eval_div")]
fn div(x: i32, y: i32) -> Result<i32, &'static str> {
    x.checked_div(y).ok_or("division by zero")
}

输出批次将包含一个错误列。错误行将在输出列中填充NULL,错误消息将存储在错误列中。

 input     output
+----+----+-----+------------------+
| a  | b  | div | error            |
+----+----+-----+------------------+
| 15 | 25 | 0   |                  |
| 5  | 0  |     | division by zero |
+----+----+-----+------------------+

结构类型

您可以使用 StructType trait 定义一个结构类型

use arrow_udf::types::StructType;

#[derive(StructType)]
struct Point {
    x: f64,
    y: f64,
}

然后您可以在函数签名中使用该结构类型

use arrow_udf::function;

#[function("point(float8, float8) -> struct Point", output = "eval_point")]
fn point(x: f64, y: f64) -> Point {
    Point { x, y }
}

目前结构类型仅支持作为返回类型。

函数注册表

如果您想按签名查找函数,可以启用 global_registry 功能

[dependencies]
arrow-udf = { version = "0.2", features = ["global_registry"] }

在定义时,每个函数都将注册到全局注册表中。然后您可以从 REGISTRY 中查找函数

use arrow_schema::DataType::Int32;
use arrow_udf::sig::REGISTRY;

let sig = REGISTRY.get("gcd", &[Int32, Int32], &Int32).expect("gcd function");
let output = sig.function.as_scalar().unwrap()(&input).unwrap();

有关更多详细信息,请参阅示例

依赖项

~11–18MB
~238K SLoC