让UDF中的class只加载一次

StarRocks的UDF class 每次执行都会重新加载,这样会让UDF中的静态变量比较安全,不会互相影响。但是一些特殊的场景需要让UDF只加载一次。本文将描述如何让UDF只加载一次。

假设我们原始的class是 LoadTest.java

public class LoadTest {
    static {
        System.out.println("load UDF");
    }
    public String evaluate(String a, Integer b) {
        return a + b;
    }
}

我们需要为他额外编写一个包装壳,在里面调用我们想调用的逻辑

public class Caller {
    static {
        System.out.println("load Caller");
    }
    public String evaluate(String a, Integer b) {
        return new LoadTest().evaluate(a, b);
    }
}

我们把 Caller 和 LoadTest 分别打一个包

javac ./*.java
jar -cf ./caller.jar ./Caller.class
jar -cf ./load_test.jar ./LoadTest.class

我们把LoadTest打的包放到 be/lib/hadoop/common/lib/

mv ./load_test.jar $STARROCKS_HOME/be/lib/hadoop/common/lib/

然后把caller这个函数注册到FE

create function Caller (string, int) returns string properties(
    "symbol" = "Caller", 
    "type" = "StarrocksJar",
    "file"="http://127.0.0.1:8084/caller.jar"
);
mysql> select caller(1,2);
+--------------+
| caller(1, 2) |
+--------------+
| 12           |
+--------------+
1 row in set (1.23 sec)

执行多次我们可以看到 LoadTest 只会被加载一次

load Caller
load UDF
load Caller
load Caller
load Caller
1赞