(一)先了解一下什么是自定义聚合函数

  1. 其实就是根据你自己的业务去进行定义你自己想要实现的方法,比如说Mysql中的sum() 方法,就是求某个字段的累加之和,那么你就可以自己实现自己的 比如说 add() 自定义聚合函数方法

(二)如何开发自定义聚合函数

  1. 首先需要实现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();}
}
  1. 然后把你想要处理的字段根据其类型传入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();}}
  1. 就是把这个项目打包成一个jar包,然后放到Presto集群所有机器下面的plugin目录下(这里需要自己随便创建一个目录,然后放到自己创建的目录下),然后就是重启集群,使用show functions 查看一下自己定义的聚合函数是不是注册成功,如果成功如图这种。

Presto如何开发自定义聚合函数相关推荐

  1. 【大数据】Presto开发自定义聚合函数

    Presto 在交互式查询任务中担当着重要的职责.随着越来越多的人开始使用 SQL 在 Presto 上分析数据,我们发现需要将一些业务逻辑开发成类似 Hive 中的 UDF,提高 SQL 使用人员的 ...

  2. oracle 自定义 聚合函数

    Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object (  --聚合函数的实质就是一个对象       sum ...

  3. SqlServer自定义聚合函数

    sqlserver2017版本包括以上的可以使用string_agg(字段,',')函数 sqlserver查询版本: select @@version Sql Server自定义聚合函数详细bai步 ...

  4. pythontransform详解_Python自定义聚合函数merge与transform区别详解

    1.自定义聚合函数,结合agg使用 2. 同时使用多个聚合函数 3. 指定某一列使用某些聚合函数 4.merge与transform使用 import pandas as pd import nump ...

  5. 95-910-148-源码-FlinkSQL-Flink SQL自定义聚合函数

    1.美图 2.基本使用 ​ Flink Table/SQL Api中自带了一些常见的聚合函数,例如sum.min.max等,但是在实际开发中需要自定义符合业务需求的聚合函数,先从一个实际案例入手:设备 ...

  6. Flink SQL自定义聚合函数

    <2021年最新版大数据面试题全面开启更新> 本篇幅介绍Flink Table/SQL中如何自定义一个聚合函数,介绍其基本用法.撤回定义以及与源码结合分析每个方法的调用位置. 基本使用 F ...

  7. SQL SERVER 2005允许自定义聚合函数

    不多说了,说明后面是完整的代码,用来将字符串型的字段的各行的值拼成一个大字符串,也就是通常所说的Concat 例如有如下表dict  ID  NAME  CATEGORY  1 RED  COLOR  ...

  8. oracle聚合函数wmsys,oracle 自定义聚合函数

    oracle提供了聚合函数的API可以让我们方便的自己定义聚合函数. 详细看oracle官方文档: http://docs.oracle.com/cd/B14117_01/appdev.101/b10 ...

  9. presto cube等复杂聚合函数

    Presto还使用GROUPING SETS,CUBE和ROLLUP语法支持复杂的聚合. 使用此语法,用户可以执行需要在单个查询中对多组列进行聚合的分析. 复杂的分组操作不支持对由输入列组成的表达式进 ...

最新文章

  1. Linux执行mount挂载覆盖文件的还原
  2. [转载]在Eclipse CDT中编译含有多个main函数的项目
  3. winform 在panel怎么实现锚点定位_高德网络定位之“移动WiFi识别”
  4. Java-JUC(一):volatile引入
  5. 聊聊WebClient的LoadBalance支持
  6. 桩身弹性压缩计算公式_基于非线性应力应变关系的桩身压缩量计算
  7. swift - xcode10 - 点击事件交互BUG - (手势和button的addTarget方法)
  8. Linux学习笔记2-文件读写操作
  9. 2017/3/10 morning
  10. Eclipse断点调试
  11. C++ opengl 矩阵的压栈与出栈
  12. 7-5 sdut-验证“哥德巴赫猜想” (10 分)(优化素数判断)
  13. 将字符串放到字符串数组中
  14. matlab errorbar对数,Matlab之errorbar
  15. 解决Linux下pcieport 0000:00:1c.5问题导致的系统根目录/磁盘空间不足
  16. Windows下QQ聊天记录中图片的默认存放位置
  17. Teemo Attacking 题解
  18. 启动计算机 登管理员用户,Windows xp系统使用管理员账户登入系统的技巧
  19. 2020哈工程上岸初复试经验
  20. python科学计算最佳实践_Python科学计算最佳实践:SciPy指南

热门文章

  1. python airflow_airflow安装与使用
  2. python中linspace函数_python的range和linspace使用详解
  3. sallen-等价类划分方法
  4. netcore 使用surging框架发布到docker
  5. cmmi 生产率和质量模型_多台显示器和生产率
  6. P2111 考场奇遇
  7. VS配置PCL“无法解析外部符号”
  8. vs2017 c语言 安装教程,Visual Studio 2017 IDE安装使用图文教程
  9. 02-React v18创建元素
  10. GitKraken Authentication问题,无法同步代码