首页 > 其他分享 >编写starrocks的自定义函数

编写starrocks的自定义函数

时间:2024-11-11 18:19:47浏览次数:5  
标签:starrocks 函数 自定义 Database 创建 jar UDF udf 编写

编写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);

标签:starrocks,函数,自定义,Database,创建,jar,UDF,udf,编写
From: https://www.cnblogs.com/mason77/p/18540299

相关文章

  • Linux基础(2)以及资源耗尽病毒的编写(详见B站泷羽sec)
    免责声明:本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害,包括但不限于数据丢失、系统损坏、个人隐私泄露或经济损失等,不承担任何责任。所有使用本教程内容的个人或组织应自行承担全部风险。Linux目录介绍:/bin 二进制可执行文......
  • ag——ack 的升级版,C语言编写,更快更人性化
    转自于:https://github.com/jaywcjlove/linux-command,后不赘述agack的升级版,C语言编写,更快更人性化补充说明摘自https://github.com/ggreer/the_silver_searcher项目的Readme.md它比ack快一个数量级。它忽略了你的.gitignore和.hgignore中的文件模式。如果你的......
  • SpringBoot集成SpringSecurity并实现自定义认证
    目录一、SpringSecurity简介二、集成SpringSecurity1、引入依赖2、编写核心配置类3、数据库建表4、自定义session失效策略5、自定义认证6、重写loadUserByUsername方法7、登录页面和接口三、总结一、SpringSecurity简介SpringSecurity是一个能够为基于Spring的企......
  • 一款 C# 编写的神经网络计算图框架
    前言深度学习技术的不断发展,神经网络在各个领域得到了广泛应用。为了满足.NET开发的需求,推荐一款使用C#编写的神经网络计算图框架。框架的使用方法接近PyTorch,提供了丰富的示例和详细的文档,帮助大家快速上手。框架介绍项目完全使用C#编写,提供了一个透明的神经网络计算......
  • 「Java开发指南」如何自定义Spring代码生成?(二)
    搭建用户经常发现自己对生成的代码进行相同的修改,这些修改与个人风格/偏好、项目特定需求或公司标准有关,本教程演示自定义代码生成模板,您将学习如何:创建自定义项目修改现有模板来包含自定义注释使用JET和Skyway标记库中的标记配置项目来使用自定义在上文中,我们为大家介绍了......
  • 使用 Janet 编写简单的文字识别程序
    在这篇文章中,我们将使用Janet语言编写一个基础的文字识别程序。该程序将读取图像数据并尝试识别其中的字符信息。Janet语言是一种灵活的、嵌入式的编程语言,适用于构建高效的小型脚本应用。基础依赖和环境设置Janet语言的库中尚未提供直接的图像处理支持,因此,我们需要安装Jan......
  • 鸿蒙自定义组件生命周期
    在开始之前,我们先明确自定义组件和页面的关系:自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个......
  • 自定义类型那点事儿
    自定义类型:结构体,位段,枚举,联合目录自定义类型:结构体,位段,枚举,联合结构体1.结构体的声明2.结构体的特殊声明3.结构体的自引用4.结构体变量的定义和初始化5.结构体内存对齐6.修改默认对齐数7.结构体传参位段1.什么是位段?2.位段的内存分配3.位段的跨平台问题枚举......
  • 在Qt中创建和使用自定义控件类时,可能会遇到以下一些常见问题
    在Qt中创建和使用自定义控件类时,可能会遇到以下一些常见问题:一、布局相关问题大小调整不正确:问题描述:自定义控件在不同的布局环境下,可能无法按照预期调整大小。例如,当将自定义控件添加到一个水平布局或垂直布局中时,它可能不会随着布局的拉伸或收缩而正确地改变自身大小。原......
  • 自定义圆形进度条控件
    以下将以创建一个简单的为例,详细说明在Qt中创建自定义控件的步骤:一、创建项目首先,打开QtCreator并创建一个新的QtWidgetsApplication项目。按照向导完成项目的基本设置,比如项目名称、存储路径等。二、创建自定义控件类继承基础控件类:在项目中创建一个新的C++类,命名为Ci......