presto / trino plugin(自定义UDF函数)开发指南

2024-03-13 18:20

本文主要是介绍presto / trino plugin(自定义UDF函数)开发指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 方案1:自定义udf插件开发

1. Presto插件机制
presto不能像hive那样配置自定义的udf,而是采用插件机制实现。Presto 的插件(Plugin)机制,是 Presto 能够整合多种数据源的核心。通过实现不同的 Plugin,Presto 允许用户在不同类型的数据源之间进行 JOIN 等计算。Presto 内部的所有数据源都是通过插件机制实现, 例如 MySQL、Hive、HBase等。Presto 插件机制不仅通过加载 Connector 来实现不同数据源的访问,还通过加载 FunctionFactory 来实现 UDF 的加载。 Presto 的 Plugin 遵循 Java 中的 ServiceLoader 规范, 实现非常简单。
2. Function实现
 
package com.facebook.presto.demo;import com.facebook.presto.spi.function.Description;
import com.facebook.presto.spi.function.ScalarFunction;
import com.facebook.presto.spi.function.SqlType;
import com.facebook.presto.spi.type.StandardTypes;
import io.airlift.slice.Slice;
import io.airlift.slice.Slices;public class MyFunctions {
    @ScalarFunction("to_upper") // 固定参数,表示函数名的意思,也就我们在使用Presto的时候用的函数名
    @Description("我的大小写转换函数") // 函数的注释
    @SqlType(StandardTypes.VARCHAR) // 表示数据类型
    public static Slice toUpper(@SqlType(StandardTypes.VARCHAR) Slice input) {
        // 将获取到的数据转换大写
        String s = input.toStringUtf8().toUpperCase();
        // 在转换后的数据放入内存返回
        return Slices.utf8Slice(s);
    }
}

3. Plugin实现
package com.facebook.presto.demo;import com.facebook.presto.spi.Plugin;
import com.google.common.collect.ImmutableSet;import java.util.Set;public class PrestoUdfPlugin implements Plugin {
    @Override
    public Set<Class<?>> getFunctions() {
        return ImmutableSet.<Class<?>>builder()
                // 添加插件class
                .add(MyFunctions.class)
                .build();
    }
}

4. 加载plugin
在src/main/resources下创建目录,注意META-INF是父目录services是子目录,只是idea合并显示了,不是说文件名里面有点.
然后创建文件com.facebook.presto.spi.Plugin。

然后文件内容为:

com.facebook.presto.demo.MDAFunctionPlugin


注: 包名 + 插件类名

5. 打包
 
mvn clean package -Dmaven.test.skip=true -U

6. 新建一个插件包文件


在生产环境上在$PRESTO_HOME/plugin目录下新建一个文件夹,用来存放自己的写的UDF Function。

mdkir -p  presto-server/plugin/demo


7. 上传jar包


将package 后的jar包和相关的依赖,上传到我们上一步新建的文件夹中。


注意:插件必须安装在Presto集群中的所有节点上(协调器和工作器)。

8. 重启服务
${PRESTO_HOME}/bin/launcher restart


9. 查看function


重启presto服务后,使用客户端连接presto。

${PRESTO_HOME}/bin/presto --catalog hive

10.输入show functions就可以看到我们注册的方法。

11.问题:

问题1:
报错内容:
Failed to execute goal com.mycila:license-maven-plugin:2.3:
check (default) on project presto-demo:
Some files do not have the expected license header


问题原因:
因为maven会对license进行检车check,而配置文件缺少头部license声明,所以报错,无法执行下去。

解决方法:
pom.xml 文件添加:

<plugin>
   <groupId>com.mycila</groupId>
    <artifactId>license-maven-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>



问题2:
报错内容:

(regexp) RegexpMultiline: Blank line before end of file


问题原因:
presto会对文件进行检查,格式不规范都会报错。

解决方法:
文件必须以空行结尾。

文件末尾不能有多余的空行。

不能有没有引用的类型。
3如List并没有使用,这种也会报错。


4.implement等关键字需要换行


5.不能有多余的空行。


总结:
presto实现自定义函数比较简单,但是如果是在presto代码下新建工程,然后进行开发,这种情况presto对于开发的格式要求比较多,索引编译会一直报错,这种情况比较麻烦,不是很推荐。

方案2:基于presto源码插件开发打包(推荐)

1.创建Maven项目,使用官方插件打包

presto

      <plugin><groupId>com.facebook.presto</groupId><artifactId>presto-maven-plugin</artifactId><version>0.3</version><extensions>true</extensions></plugin>

 trino

<plugin><groupId>io.trino</groupId><artifactId>trino-maven-plugin</artifactId><version>11</version><extensions>true</extensions&g

这篇关于presto / trino plugin(自定义UDF函数)开发指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805759

相关文章

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

CentOS7更改默认SSH端口与配置指南

《CentOS7更改默认SSH端口与配置指南》SSH是Linux服务器远程管理的核心工具,其默认监听端口为22,由于端口22众所周知,这也使得服务器容易受到自动化扫描和暴力破解攻击,本文将系统性地介绍... 目录引言为什么要更改 SSH 默认端口?步骤详解:如何更改 Centos 7 的 SSH 默认端口1

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4: