Presto如何开发自定义聚合函数
(一)先了解一下什么是自定义聚合函数
- 其实就是根据你自己的业务去进行定义你自己想要实现的方法,比如说Mysql中的sum() 方法,就是求某个字段的累加之和,那么你就可以自己实现自己的 比如说 add() 自定义聚合函数方法
(二)如何开发自定义聚合函数
- 首先需要实现Presto提供的Plugin接口,然后把要实现的聚合函数所在的类添加到集合中
package com.tapdb.analytics.presto.udaf;import com.google.common.collect.ImmutableSet;
import io.prestosql.spi.Plugin;import java.util.Set;public class TapdbAnalyticsPlugin implements Plugin {@Overridepublic Set<Class<?>> getFunctions() {return ImmutableSet.<Class<?>>builder().add(DateHistogramAggregation.class).add(ArraySumAggregation.class).add(ArrayConstructScalar.class).add(RetentionAggregation.class).add(DecodeBitSetAggregation.class).build();}
}
- 然后把你想要处理的字段根据其类型传入input()方法的参数中进行处理,这里需要注意如何把你处理好的结果集传给下一个combine()方法,需要通过SliceState进行作为桥梁,当然这个也可以自己进行自定义,output()方法是把最后的结果集进行构造然后,通过Presto提供的API进行构建返回结果。
package com.tapdb.analytics.presto.udaf;import io.airlift.slice.Slice;
import io.airlift.slice.Slices;
import io.prestosql.spi.block.BlockBuilder;
import io.prestosql.spi.function.*;
import io.prestosql.spi.type.StandardTypes;/*** @Description DecodeBitSetAggregation* @Date 2020/6/16* @Author wangwei*/
@AggregationFunction("tapdb_bitset_decode")
public class DecodeBitSetAggregation {@InputFunctionpublic static void input(@AggregationState SliceState state,@SqlType(StandardTypes.BIGINT) long mask,@SqlType(StandardTypes.BIGINT) long value) {if (state.getSlice() == null) {long capacity = 30 * Long.BYTES;Slice slice = Slices.allocate((int) capacity);state.setSlice(slice);}Slice slice = state.getSlice();long retainValue = mask <= 0 ? value ^ mask : value & mask;int tmpIndex = 0;for (int i = 29; i >= 0; i--) {int offset = Long.BYTES * tmpIndex;slice.setLong(offset, Long.lowestOneBit(retainValue) == 1 ? 1L : 0L);retainValue = retainValue >> 1;tmpIndex++;}}@CombineFunctionpublic static void combine(@AggregationState SliceState state, @AggregationState SliceState otherState) {Slice otherSlice = otherState.getSlice();Slice slice = state.getSlice();if (otherSlice == null) {return;}if (slice == null) {state.setSlice(otherSlice);return;}int indexNum = slice.length() / Long.BYTES;for (int i = 0; i < indexNum; ++i) {int offset = i * Long.BYTES;slice.setLong(offset, slice.getLong(offset) + otherSlice.getLong(offset) > 0 ? 1L : 0L);}}@OutputFunction("array(bigint)")public static void output(@AggregationState SliceState state, BlockBuilder out) {Slice slice = state.getSlice();if (slice == null) {out.appendNull();return;}int byteArrayNum = slice.length() / Long.BYTES;BlockBuilder blockBuilder = out.beginBlockEntry();for (int i = 0; i < byteArrayNum; ++i) {int offset = i * Long.BYTES;long value = slice.getLong(offset);blockBuilder.writeLong(value).closeEntry();}out.closeEntry();}}
- 就是把这个项目打包成一个jar包,然后放到Presto集群所有机器下面的plugin目录下(这里需要自己随便创建一个目录,然后放到自己创建的目录下),然后就是重启集群,使用show functions 查看一下自己定义的聚合函数是不是注册成功,如果成功如图这种。
Presto如何开发自定义聚合函数相关推荐
- 【大数据】Presto开发自定义聚合函数
Presto 在交互式查询任务中担当着重要的职责.随着越来越多的人开始使用 SQL 在 Presto 上分析数据,我们发现需要将一些业务逻辑开发成类似 Hive 中的 UDF,提高 SQL 使用人员的 ...
- oracle 自定义 聚合函数
Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象 sum ...
- SqlServer自定义聚合函数
sqlserver2017版本包括以上的可以使用string_agg(字段,',')函数 sqlserver查询版本: select @@version Sql Server自定义聚合函数详细bai步 ...
- pythontransform详解_Python自定义聚合函数merge与transform区别详解
1.自定义聚合函数,结合agg使用 2. 同时使用多个聚合函数 3. 指定某一列使用某些聚合函数 4.merge与transform使用 import pandas as pd import nump ...
- 95-910-148-源码-FlinkSQL-Flink SQL自定义聚合函数
1.美图 2.基本使用 Flink Table/SQL Api中自带了一些常见的聚合函数,例如sum.min.max等,但是在实际开发中需要自定义符合业务需求的聚合函数,先从一个实际案例入手:设备 ...
- Flink SQL自定义聚合函数
<2021年最新版大数据面试题全面开启更新> 本篇幅介绍Flink Table/SQL中如何自定义一个聚合函数,介绍其基本用法.撤回定义以及与源码结合分析每个方法的调用位置. 基本使用 F ...
- SQL SERVER 2005允许自定义聚合函数
不多说了,说明后面是完整的代码,用来将字符串型的字段的各行的值拼成一个大字符串,也就是通常所说的Concat 例如有如下表dict ID NAME CATEGORY 1 RED COLOR ...
- oracle聚合函数wmsys,oracle 自定义聚合函数
oracle提供了聚合函数的API可以让我们方便的自己定义聚合函数. 详细看oracle官方文档: http://docs.oracle.com/cd/B14117_01/appdev.101/b10 ...
- presto cube等复杂聚合函数
Presto还使用GROUPING SETS,CUBE和ROLLUP语法支持复杂的聚合. 使用此语法,用户可以执行需要在单个查询中对多组列进行聚合的分析. 复杂的分组操作不支持对由输入列组成的表达式进 ...
最新文章
- Linux执行mount挂载覆盖文件的还原
- [转载]在Eclipse CDT中编译含有多个main函数的项目
- winform 在panel怎么实现锚点定位_高德网络定位之“移动WiFi识别”
- Java-JUC(一):volatile引入
- 聊聊WebClient的LoadBalance支持
- 桩身弹性压缩计算公式_基于非线性应力应变关系的桩身压缩量计算
- swift - xcode10 - 点击事件交互BUG - (手势和button的addTarget方法)
- Linux学习笔记2-文件读写操作
- 2017/3/10 morning
- Eclipse断点调试
- C++ opengl 矩阵的压栈与出栈
- 7-5 sdut-验证“哥德巴赫猜想” (10 分)(优化素数判断)
- 将字符串放到字符串数组中
- matlab errorbar对数,Matlab之errorbar
- 解决Linux下pcieport 0000:00:1c.5问题导致的系统根目录/磁盘空间不足
- Windows下QQ聊天记录中图片的默认存放位置
- Teemo Attacking 题解
- 启动计算机 登管理员用户,Windows xp系统使用管理员账户登入系统的技巧
- 2020哈工程上岸初复试经验
- python科学计算最佳实践_Python科学计算最佳实践:SciPy指南
热门文章
- python airflow_airflow安装与使用
- python中linspace函数_python的range和linspace使用详解
- sallen-等价类划分方法
- netcore 使用surging框架发布到docker
- cmmi 生产率和质量模型_多台显示器和生产率
- P2111 考场奇遇
- VS配置PCL“无法解析外部符号”
- vs2017 c语言 安装教程,Visual Studio 2017 IDE安装使用图文教程
- 02-React v18创建元素
- GitKraken Authentication问题,无法同步代码