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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/536198.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十七章垃圾回收器

第十七章垃圾回收器 文章目录 第十七章垃圾回收器1. GC分类与性能指标1.1 垃圾回收器概述1.2 垃圾回收器分类1.3 评估GC的性能指标吞吐量暂停时间吞吐量VS暂停时间 2. 不同的垃圾回收器概述七种经典垃圾回收器七种经典收集器与垃圾分代之间的关系垃圾收集器的组合关系如何查看默…

Nacos 集群搭建

1 . 集群结构图 : 其中包括3个nacos结点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx ; 我们计划的集群结构 : 三个nacos结点的地址 : 节点ipportnacos1192.168.150.18845nacos2192.168.150.18846nacos3192.168.150.18847 2 . 搭建集群 搭…

24考研调剂 | 武汉纺织大学

教育部重点实验室招收24年调剂生&#xff0c;材料、化学、机械工程、计算机、力学等相关专业 考研调剂招生信息 学校:武汉纺织大学 专业:工学->材料科学与工程 年级:2024 招生人数:100 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看)…

macOS安装maven

官网下载maven https://maven.apache.org/download.cgi如下图所示&#xff1a; 1.解压并复制到指定的目录中2.配置环境变量 vim ~/.bash_profile进行文件的修改 export M2_HOME/Users/fanfan/company/apache-maven-3.9.6 export PATH$PATH:$M2_HOME/bin3.终端中输入source ~…

day02vue学习

day02 一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 &#xff08;演示&#xff09; 渲染 / 删除 / 修…

vue搭建脚手架遇到的一个bug

看起来运行vue init命令时出现了问题。似乎vue/cli-init插件没有被全局安装。你可以尝试使用npm&#xff08;Node Package Manager&#xff09;全局安装它。 按照以下命令&#xff1a; npm install -g vue/cli-init npm install -g vue-cli

考虑功率均分与电压频率的事件触发分布式二次控制MATLAB模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 此模型是在《基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型》上进一步创作的&#xff0c;之前的模型只考虑了二次电压与频率控制&#xff0c;并没有考虑均分这一项点。 因此…

帮人写系列——大连浩如科技有限公司的uwb(ros节点)

在读研期间因为项目或者个人兴趣接触过不少传感器&#xff0c;这一款是当时带本科师弟做东西时候买的玩意uwb&#xff0c;因为要用到ros中&#xff0c;需要发布成话题&#xff0c;但对方技术人员说并没有这玩意&#xff0c;就帮忙写了这个&#xff0c;今天反馈说后续产品中一直…

开口式霍尔电流传感器助力直流配电改造

彭姝麟 Acrelpsl 1开口式霍尔电流传感器助力直流配电改造 1.1 改造要求 系统改造要求不停电进行直流系统切改&#xff0c;即在不失去直流电源的情况下进行负荷的倒出和倒入&#xff0c;改造工程难度大。针对此需求&#xff0c;可采用开口式霍尔电流传感器来解决改造项目中直流…

离线数仓(七)【DIM 层开发】

前言 今天开始 DIM 层的开发&#xff0c;说开发好像有点不配&#xff0c;还只是学习阶段&#xff0c;离开发还有很长的路要走。 一个人想象自己不懂得的事很容易浪漫。 --《沉默的大多数》王小波 1、DIM 层开发 DIM层设计要点&#xff1a; DI…

第0章 学习包介绍

一、考试介绍 二、考点分析 白盒测试、黑盒测试、面向对象测试、web测试&#xff1b;下午题考的概率很大&#xff1b; 上午题考点&#xff1a; 三、资料包 四、如何学习

计算机网络-第7章 网络安全(2)

7.5 密钥分配 7.6 互联网使用的安全协议 7.7 系统安全&#xff1a;防火墙与入侵检测