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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所