Presto自定义函数UDF

Presto函数分类

Presto函数主要分为:scalar,aggregation 和 window 三种类型

  • ScalarFunction :标量函数,简单来说就是Java中的一个静态方法,本身没有任何状态.
  • AggregationFunction :需要累积状态的函数,例如 COUNT、AVG 等。开发 Aggregation 函数的难点在于维护状态。
  • WindowFunction:就是窗口函数,可以理解为分析型函数,即将某一列多行中的值按照一定的聚合规则进行计算。

开发UDF(Scalar举例)

public class DateFunctions {
	public static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
	@ScalarFunction("convert_date")
	@Description("Date convert function")
	@SqlType(StandardTypes.VARCHAR)
	public static Slice convert_date(@SqlType(StandardTypes.BIGINT) long inNumber) {
		String resDate =     dtf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(inNumber), ZoneId.systemDefault()));
	 	return Slices.utf8Slice(resDate);
	 }
}
  • @ScalarFunction("convert_date"):方法名,在使用自定义插件方法时,调用的名字;
  • @Description("Date convert function "):方法描述,可以通过show functions命令查看,第三列就是方法描述;
  • @SqlType 标记函数的返回值类型,这里返回字符串,因此是  StandardTypes.VARCHAR
    注:Presto中不支持直接对string的输入和输出,使用Slice.toStringUtf8()将Slice类型的数据转换成为字符串,使用Slices.utf8Slice(result)将字符串转换成Slice类型。

插件注册

Presto 的插件(Plugin)机制,是 Presto 能够整合多种数据源的核心。通过实现不同的 Plugin,Presto 允许用户在不同类型的数据源之间进行 JOIN 等计算。Presto 内部的所有数据源都是通过插件机制实现, 例如 MySQL、Hive、HBase等。Presto 插件机制不仅通过加载 Connector 来实现不同数据源的访问,还通过加载 FunctionFactory 来实现 UDF 的加载。 Presto 的 Plugin 遵循 Java 中的 ServiceLoader 规范.

public class PrestoUdfPlugin implements Plugin {
    @Override
    public Set<Class<?>> getFunctions() {
        return ImmutableSet.<Class<?>>builder()
                .add(DateFunctions.class)
                .build();
    }
}

在 src/main/resources/META-INF/services 中新建名为  com.facebook.presto.spi.Plugin 的文本文件,内容就是之前实现  Plugin 接口的类名,打jar时记得将 META-INF/services 打包进去。
将Jar包放到${PRESTO_HOME}/plugin/ 目录下方
注:所有worker节点都要部署。

验证UDF

  • Jar包放好位置后重启Presto
  • 通过show functions 可以查看到自已定义的UDF
  • 通过简单sql语句来验证UDF方法是否可用
小捐怡情,大捐感激,点下广告也是极好的