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方法是否可用
评论区