7 个版本

0.3.2 2024年6月24日
0.3.1 2024年5月24日
0.2.0 2024年4月25日
0.1.2 2024年3月4日
0.1.0 2024年1月31日

#1167 in 网页编程

Download history 1977/week @ 2024-05-01 3007/week @ 2024-05-08 2977/week @ 2024-05-15 2020/week @ 2024-05-22 903/week @ 2024-05-29 992/week @ 2024-06-05 774/week @ 2024-06-12 762/week @ 2024-06-19 658/week @ 2024-06-26 908/week @ 2024-07-03 667/week @ 2024-07-10 559/week @ 2024-07-17 501/week @ 2024-07-24 524/week @ 2024-07-31 544/week @ 2024-08-07 844/week @ 2024-08-14

每月 2,512 次下载

Apache-2.0

66KB
1K SLoC

Apache Arrow 的 JavaScript UDF

Crate Docs

使用方法

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

[dependencies]
arrow-udf-js = "0.3"

创建一个 Runtime 并以字符串形式定义您的 JS 函数。请注意,函数必须导出,并且其名称必须与传递给 add_function 的名称匹配。

use arrow_udf_js::{Runtime, CallMode};

let mut runtime = Runtime::new().unwrap();
runtime
    .add_function(
        "gcd",
        arrow_schema::DataType::Int32,
        CallMode::ReturnNullOnNullInput,
        r#"
        export function gcd(a, b) {
            while (b != 0) {
                let t = b;
                b = a % b;
                a = t;
            }
            return a;
        }
        "#,
    )
    .unwrap();

然后您可以在 RecordBatch 上调用 JS 函数

let input: RecordBatch = ...;
let output: RecordBatch = runtime.call("gcd", &input).unwrap();

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

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

对于返回集合的函数(或所谓的表函数),将函数定义为生成器

use arrow_udf_js::{Runtime, CallMode};

let mut runtime = Runtime::new().unwrap();
runtime
    .add_function(
        "range",
        arrow_schema::DataType::Int32,
        CallMode::ReturnNullOnNullInput,
        r#"
        export function* range(n) {
            for (let i = 0; i < n; i++) {
                yield i;
            }
        }
        "#,
    )
    .unwrap();

然后您可以通过 call_table_function 调用表函数

let chunk_size = 1024;
let input: RecordBatch = ...;
let outputs = runtime.call_table_function("range", &input, chunk_size).unwrap();
for result in outputs {
    let output: RecordBatch = result?;
    // do something with the output
}

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

+-----+-------+
| row | range |
+-----+-------+
| 0   | 0     |
| 2   | 0     |
| 2   | 1     |
| 2   | 2     |
+-----+-------+

JS 代码将在嵌入式 QuickJS 解释器中运行。

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

类型映射

以下表格显示了 Arrow 与 JavaScript 之间的类型映射

Arrow 类型 JS 类型
Null null
Boolean boolean
Int8 number
Int16 number
Int32 number
Int64 number
UInt8 number
UInt16 number
UInt32 number
UInt64 number
Float32 number
Float64 number
String string
LargeString string
Date32 Date
Timestamp Date
Decimal128 BigDecimal
Decimal256 BigDecimal
Binary Uint8Array
LargeBinary Uint8Array
List(Int8) Int8Array
List(Int16) Int16Array
List(Int32) Int32Array
List(Int64) BigInt64Array
List(UInt8) Uint8Array
List(UInt16) Uint16Array
List(UInt32) Uint32Array
List(UInt64) BigUint64Array
List(Float32) Float32Array
List(Float64) Float64Array
List(others) Array
Struct object

此 crate 还支持以下 Arrow 扩展类型

扩展类型 物理类型 箭头:扩展:名称 JS 类型
JSON 字符串,二进制,大二进制 arrowudf.json 任何(通过 JSON.parse(string) 解析)
十进制 String arrowudf.decimal BigDecimal

依赖项

~10–16MB
~256K SLoC