侧边栏壁纸
  • 累计撰写 26 篇文章
  • 累计创建 25 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Presto自定义函数UDF

iRay
2022-10-04 / 0 评论 / 0 点赞 / 653 阅读 / 3339 字

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方法是否可用
0

评论区