编写starrocks的自定义函数

编写StarRocks的自定义函数

前提条件

StarRocks使用udf函数需要满足以下条件:

  • 安装jdk1.8

  • 开启udf功能,在FE的配置文件fe/conf/fe.conf中设置配置项enable_udftrue,并且重启FE节点使配置生效

开发使用UDF函数

创建maven项目,并且用java实现udf函数

  1. 创建maven项目并且添加以下的pom依赖:

        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
    
            <groupId>org.example</groupId>
            <artifactId>udf</artifactId>
            <version>1.0-SNAPSHOT</version>
    
            <properties>
                <maven.compiler.source>8</maven.compiler.source>
                <maven.compiler.target>8</maven.compiler.target>
            </properties>
    
            <dependencies>
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>fastjson</artifactId>
                    <version>1.2.76</version>
                </dependency>
            </dependencies>
    
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <version>2.10</version>
                        <executions>
                            <execution>
                                <id>copy-dependencies</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>copy-dependencies</goal>
                                </goals>
                                <configuration>
                                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>3.3.0</version>
                        <executions>
                            <execution>
                                <id>make-assembly</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>single</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </project>
    
  2. 开发UDF:

    • Scalar UDF:

      Scalar udf也就是即用户自定义标量函数,可以对单行数据进行操作,输出单行结果。当您在查询时使用 Scalar UDF,每行数据最终都会按行出现在结果集中。典型的标量函数包括 UPPERLOWERROUNDABS

      其中主要是通过写一个evaluate函数即可。比如现在创建一个获取json全部key的函数string _get_json_key_as_str(string),那么代码就如下:

      public class GetJsonKeyAsString {
          public final String evaluate(String text) {
              if (text == null || text.isEmpty()) {
                  return null;
              }
      
              JSONObject jsonObject = JSON.parseObject(text);
      
              if (!jsonObject.keySet().isEmpty()) {
                  return jsonObject.keySet().toString();
              } else {
                  return null;
              }
      
          }
      }
      

      udf函数不需要继承或者实现什么接口,只能给定规范的函数名即可,不过要注意输出和输出的数据类型。

    • UDAF函数:

    • UDWF函数:

    • UDTF函数:

  3. 打包和上传自定义函数jar包:

    使用package命令打包会生成两个文件:udf-1.0-SNAPSHOT.jarudf-1.0-SNAPSHOT-jar-with-dependencies.jar。需要将udf-1.0-SNAPSHOT-jar-with-dependencies.jar包上传到服务器上,这个服务器可以是基于nginx的,也可以是python搭建的简单服务器,前提是FE和BE都可以进行HTTP访问。

  4. 在StarRocks中创建udf函数:

    StarRocks 内提供了两种 Namespace 的 UDF:一种是 Database 级 Namespace,一种是 Global 级 Namespace。

    • 如果没有特殊的 UDF 可见性隔离需求,您可以直接选择创建 Global UDF。在引用 Global UDF 时,直接调用Function Name 即可,无需任何 Catalog 和 Database 作为前缀,访问更加便捷

    • 如果有特殊的 UDF 可见性隔离需求,或者需要在不同 Database下创建同名 UDF,那么你可以选择在 Database 内创建 UDF。此时,如果您的会话在某个 Database 内,您可以直接调用 Function Name 即可;如果您的会话在其他 Catalog 和 Database 下,那么您需要带上 Catalog 和 Database 前缀,例如: catalog.database.function

    注意:
    创建 Global UDF 需要有 System 级的 CREATE GLOBAL FUNCTION 权限;创建数据库级别的 UDF 需要有数据库级的 CREATE FUNCTION 权限;使用 UDF 需要有对应 UDF 的 USAGE 权限

    语法

    CREATE [GLOBAL] FUNCTION [DB]._get_json_key_as_str(string) 
    RETURNS string
    PROPERTIES (
        "symbol" = "com.starrocks.udf.sample.GetJsonKeyAsStr", 
        "type" = "StarrocksJar",
        "file" = "http://http_host:http_port/udf-1.0-SNAPSHOT-jar-with-dependencies.jar"
    );
    
    参数 描述
    symbol UDF所在项目的类名。格式为<package_name>.<class_name>
    type 用于标记所创建的UDF类型。取值为StarrocksJar,表示基于Java的UDF
    file UDF所在Jar包的HTTP路径。格式为http://<http_server_ip>:<http_server_port>/<jar_package_name>

    注意:
    在使用show functions的时候,如果创建的是global的函数,那么就会出现unknow databases DB的错误,创建的是DB的函数那么就没问题

查看UDF信息

执行以下的命令

SHOW [GLOBAL] FUNCTIONS;

删除UDF

执行以下的命令

DROP [GLOBAL] FUNCTION <function_name>(arg_type [, ...]);

例如:删除上面的函数代码如下:

drop function db._get_json_key_as_str(string);
posted @   Mason77  阅读(304)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示