版本说明
- Presto 0.227
详细步骤
-
创建Maven工程,在pom文件中引入presto-spi和guava依赖,指定打包插件
-
创建类并编写UDF函数
Presto 中函数分为三种:scalar,aggregation 和 window 。此处以Nginx日志中时间字段进行标准格式化为例,使用的是scalar即标量函数,它类似于Hive中的UDF。
@ScalarFunction(“format_nginx_time”) 该注解用于指定函数名称,即在Presto客户端查询时使用的函数名
@Description(“tranform time in nginx log to standard format”) 该注解用于对函数功能进行描述
@SqlType(StandardTypes.VARCHAR) 该注解用于指定函数的返回类型。
另外对传入的参数也需要使用SqlType注解指定入参类型。
formatNginxTime函数中实现具体的转换逻辑,Presto中没有String类型,需要使用它内部定义的序列化方式,因此该函数的返回值类型使用Slice -
进行插件注册
创建UDFPlugin类(名称随意),实现Plugin接口,并重写getFunctions方法,将刚刚编写的UDF函数对应的类加入其中。 -
在src/main/resources/META-INF/services 中新建名为 com.facebook.presto.spi.Plugin 的文本文件,内容就是之前实现 Plugin 接口的类名
-
在Presto Server的plugin目录下创建一个新的目录presto-udf(名称随意),把项目打成jar包,上传到presto-udf目录,并且拷贝一份guava的jar包到该目录下
注意:如果Presto集群有3个节点,那么每个节点都需要进行第5步操作。因为实际的查询任务由Presto中的Worker完成,必须保证每个Worker节点都能找到UDF。 -
重启所有的Presto Server,查看日志,如果PluginManager成功加载了上面的jar包,并且注册了UDF函数,就表示部署成功。为了进一步验证,可以在Presto Client中使用show functions命令查看函数是否成功注册。
-
使用UDF