目录
1. 类型
1.1. 原生容器类型(Native container type)
- presto架构的类型
框架会自动将 SQL 中的数据类型与 “原生容器类型” (Native container type)进行绑定;
目前“原生容器类型”只包括:- boolean
- long
- double
- Slice
- Block
2. 函数开发
- 函数类型
- 标量函数
- 聚合函数
- 窗口函数
参考:
2.1. 注解
-
常用注解
@ScalarFunction 用于声明标量函数的名称和别名 @Description 用于生成函数的功能描述 @SqlType 用于声明函数的返回类型和参数类型 @TypeParameter 用于声明类型变量,它所声明的类型变量可以用于函数的返回类型和参数类型, 框架在运行时会自动将变量与具体的类型进行绑定 @SqlNullable 用于表示函数参数或返回结果可
2.1.1. 注解使用
@TypeParameter 的使用有点类似 Java 中泛型的用法,类型变量T在声明完之后就可以在 @SqlType 注解中使用。
在实际的调用过程中,框架会将T与实际 SQL 类型进行绑定,
然后再去调用以对应的原生容器类型为参数的实际方法。
2.2. 自定义标量函数
- 注解架构
2.3. 聚合函数
2.3.1. 概述
-
聚合
- 聚合过程 一般涉及多行,是一个
累积计算
过程; - 因进行分布式计算, 使用 状态对象 来维护和记录中间计算的结果;
- 聚合过程 一般涉及多行,是一个
-
聚合过程
input(state, value) -- 不同的worker上执行 combine(state1, state2) -- 两两结合, 得到一个; output(state, out) -- 输出state
-
关键点
- 注解框架
- 接口:
1. AccumulatorState //== 简单聚合 对于简单的聚合,该接口只需要新增聚合所需的getter和setter,框架会自动生成相关的实现和序列化代码; //== 复杂聚合 1. AccumulatorStateFactory 2. AccumulatorStateSerializer 如果聚合过程中需要记录复杂类型(LIST、MAP或自定义的类)的状态, 则需要额外实现 ccumulatorStateFactory接口 和 AccumulatorStateSerializer接口, 并在状态接口上使用 @AccumulatorStateMetadata 注解,在注解中指定 stateFactoryClass 和stateSerializerClass。 3. BlockBuilder 类为结果输出类,聚合计算出的最终结果值将通过BlockBuilder进行输出; : 具体代码示例见参考连接;
参考:
2.3.2.
2.4. 窗口函数
2.4.1. 概述
- 窗口函数在查询结果的行上进行计算,执行顺序在HAVING子句之后,ORDER BY子句之前。
- 在 Presto SQL 中,窗口函数的语法形式如下:
windowFunction(arg1,....argn) OVER([PARTITION BY<...>] [ORDER BY<...>] [RANGE|ROWS BETWEEN AND])
2.5. 函数注册
- 概述
- Presto 函数由MetadataManager中的 FunctionRegistry 进行管理,开发的函数要生效必须要先注册到
FunctionRegistry
中。 - 函数注册是在 Presto 服务启动过程中进行的,有以下两种方式进行函数注册。
- Presto 函数由MetadataManager中的 FunctionRegistry 进行管理,开发的函数要生效必须要先注册到
2.5.1. 内置函数注册
- 注册
// 注册过程 FunctionListBuilder builder = new FunctionListBuilder() .window(RowNumberFunction.class) .aggregate(ApproximateCountDistinctAggregation.class) .scalar(RepeatFunction.class) .function(MAP_HASH_CODE) ......
2.5.2. 插件函数注册
-
插件函数注册
PluginManager 在安装插件时会调用插件的 getFunctions() 方法, 将获取到的函数集合通过 MetadataManager 的 addFunctions 方法进行注册:
-
getFunctions()
// 返回拓展的函数集合 public class ExampleFunctionsPlugin implements Plugin { @Override public Set<Class<?>> getFunctions() { return ImmutableSet.<Class<?>>builder() .add(ExampleNullFunction.class) .add(IsNullFunction.class) .add(IsEqualOrNullFunction.class) .add(ExampleStringFunction.class) .add(ExampleAverageFunction.class) .build(); } }