0%

presto创建UDF函数

通过开发Plugin插件方式开发Presto UDF

Presto 插件机制为开发者提供了以下功能:

  • 对接自定义存储系统
  • 添加自定义数据类型
  • 添加自定义处理函数
  • 自定义权限控制

以下是开发Presto UDF函数的步骤

1、逻辑代码开发

1
2
3
4
5
6
7
8
9
10
11
public class UdfDemo
{
private UdfDemo(){}
@Description("两值相除")
@ScalarFunction(value = "divide")
@SqlType(StandardTypes.DOUBLE)
public static double divide(@SqlType(StandardTypes.DOUBLE) double num01,@SqlType(StandardTypes.DOUBLE) double num02){
double result = num01/num02;
return result;
}
}

注意点

  • @Description 是自定义方法注释
  • @ScalarFunction 是函数名称
  • @SqlType 是函数出参
  • @ScalarFunction 中函数名称需要和具体方法名称保持一致
  • 方法入参需要添加 @SqlType 控制Java类型与Presto类型对应

2、插件编写

1
2
3
4
5
6
7
8
public class DemoPlugin implements Plugin {
@Override
public Set<Class<?>> getFunctions() {
return ImmutableSet.<Class<?>>builder()
.add(UdfDemo.class)
.build();
}
}

注意点

  • add所添加类即为对应的UDF方法类

3、服务注册

  • 在src/main/ 目录下创建以下文件夹resource/META-INF/services
  • 在services文件夹中添加名称为 com.facebook.presto.spi.Plugin的文件
  • 在 com.facebook.presto.spi.Plugin中添加实现的插件类名称,如图所示

批注 2020-07-01 192624.png

4、发布jar包

  • 用maven 将项目打包(添加所有依赖)
  • 在presto 安装目录下的plugin 文件夹中新建文件夹名称为UDF名称,将jar包放置于该文件夹中
  • 重启presto服务

5、在cli端使用UDF

如图所示

批注 2020-07-01 193431.png

过程中可能出现的异常

presto 启动日志中出现 localfile already exist,原因maven打包中添加了 以下依赖

1
2
3
4
5
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-local-file</artifactId>
<version>0.235.1</version>
</dependency>