Presto开发udf自定义函数(标量函数)

前言:在 Presto 中,函数大体分为三种:scalar,aggregation 和 window 类型。 scalar 就是标量函数,简单来说就是 Java 中的一个静态方法,本身没有任何状态。下面介绍的就是scalar标量函数

相比hive的udf开发,presto的udf并不叫做自定义函数,在presto中的所有的方法都是以插件(plugin)的方式加载到presto中的,下面介绍一下自定义插件开发过程。

1.添加相关的依赖

dependencies

    com.facebook.presto

    presto-spi

    0.210

    provided

build plugin

     com.facebook.presto

     presto-maven-plugin

     0.3

    true

2.编写udf函数,presto中的所有函数都应该编写成静态方法,

代码示例:

@ScalarFunction("long2Ip")

@Description("Convert decimal IP to IP string.")

public final class Long2IpFunction

{

    private Long2IpFunction()

    {}

    @TypeParameter("T")

    @SqlType(StandardTypes.VARCHAR)

    public static Slice long2Ip(@SqlType("T") Slice input)

    {

        String strIp = input.toStringUtf8();

        long longIp = Long.parseLong(strIp);

 

        return long2Ip(longIp);

    }

    @TypeParameter("T")

    @SqlType(StandardTypes.VARCHAR)

    public static Slice long2Ip(@SqlType("T") long input)

    {

        long longIp = input;

        String result = "";

        if (!(longIp < 0 || longIp > 4294967295L)) {

            result = IpIpUtil.LongToIp(longIp);

        }

        return Slices.utf8Slice(result);

    }

}

注释说明:

@ScalarFunction("long2Ip"):方法名称,在使用自定义插件方法时,调用的名字,理论上随便取;
@Description("Convert decimal IP to IP string."):方法描述,帮助其他人使用你的方法,可以通过show functions命令查看,第三列就是方法描述;
@TypeParameter("T"):类型参数,相当于java中范型的用法"";
@SqlType(StandardTypes.VARCHAR):查询返回类型,或者是参数类型列表类型,StandardType是presto中的内置对象,提供相应的数据类型。

值得一提:

Presto中不支持直接对string的输入和输出,使用Slice.toStringUtf8()将Slice类型的数据转换成为字符串,使用Slices.utf8Slice(result)将字符串转换成Slice类型。

3.插件注册

将udf函数的逻辑写好之后,需要把相关的类注册到plugin中,才能被presto识别

3.1编写插件注册类

public class FunctionsPlugin

        implements Plugin

{

    @Override

    public Set> getFunctions()

    {

        return ImmutableSet.>builder()

                .add(Ip2LongFunction.class)

                .build();

    }

}

3.2加载plugin资源

在 src/main/resources/META-INF/services 中新建名为 com.facebook.presto.spi.Plugin 的文本文件,注意是文件,添加内容:

XXX.xxx.xxx.FunctionsPlugin

4.打包,使用命令:

>mvn clean package

5.上传prestoudf-1.0.0-jar-with-dependencies.jar到${PRESTO_HOME}/plugin/${你的插件名称}/下,然后解压到当前路径下:

>tar -zxvf prestoudf-1.0.0-jar-with-dependencies.jar

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

6.重启presto服务

>${PRESTO_HOME}/bin/launcher start

7.启动presto客户端,输入show functions可以看到我们注册的方法

你可能感兴趣的:(plugin,prestoudf,presto)