大数据Presto(四):Presto自定义函数和JDBC连接

news2025/7/4 12:08:09

文章目录

Presto自定义函数和JDBC连接

一、Presto 自定义函数

1、​​​​​​​UDF函数

2、​​​​​​​UDAF函数

二、Presto JDBC连接


Presto自定义函数和JDBC连接

​​​​​​​一、Presto 自定义函数

我们可以登录Presto客户端,使用命令:show functions 来查询对应的内置函数。我们也可以自己定义函数,自定义的函数包含UDF和UDAF函数。

1、​​​​​​​​​​​​​​UDF函数

自定义UDF函数及使用可以按照下面步骤来实现。

1.1、创建Maven项目,加入如下依赖

<dependency>
    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-spi</artifactId>
    <version>0.259</version>
</dependency>
<dependency>
    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-array</artifactId>
    <version>0.259</version>
</dependency>
<dependency>
    <groupId>io.airlift</groupId>
    <artifactId>stats</artifactId>
    <version>0.163</version>
</dependency>

<build>
  <plugins>

    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <!-- 设置false后是去掉 MySpark-1.0-SNAPSHOT-jar-with-dependencies.jar 后的 “-jar-with-dependencies” -->
        <!--<appendAssemblyId>false</appendAssemblyId>-->
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <mainClass>com.lw.java.myflink.Streaming.example.FlinkReadSocketData</mainClass>
          </manifest>
        </archive>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>assembly</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

1.2、创建Presto注册插件类

package com.lansonjy.prestocode;
import com.facebook.presto.spi.Plugin;
import com.google.common.collect.ImmutableSet;

import java.util.Set;
//Presto 注册自定义函数的类,此类需要继承Plugin接口
public class MyFunctionsPlugin implements Plugin {
    @Override
    public Set<Class<?>> getFunctions()
    {
        return ImmutableSet.<Class<?>>builder()
                //注册UDF,这里填写对应的UDF类
                .add(MyUDF.class)
                .build();
    }
}

1.3、创建“MyUDF”类,实现自定义UDF逻辑

这里自定义的UDF函数实现大写字母转换成小写字母。代码如下:

package com.lansonjy.prestocode;

import com.facebook.presto.spi.function.Description;
import com.facebook.presto.spi.function.ScalarFunction;
import com.facebook.presto.spi.function.SqlType;
import com.facebook.presto.spi.type.StandardTypes;
import io.airlift.slice.Slice;
import io.airlift.slice.Slices;

//自定义UDF函数
public class MyUDF {
    //自定义UDF函数使用时的名称
    @ScalarFunction("myudf")
    //函数的描述
    @Description("转换字母大写为小写")
    //指定函数的返回类型,字符串类型必须返回Slice, 使用 Slices.utf8Slice 方法可以方便的将 String 类型转换成 Slice 类型
    @SqlType(StandardTypes.VARCHAR)
    public static Slice lowercase(@SqlType(StandardTypes.VARCHAR) Slice in)
    {
        String argument = in.toStringUtf8();
        return Slices.utf8Slice(argument.toLowerCase());
    }
}

1.4、创建“resources”资源目录

在resouces资源目录中创建“META-INF/services”多级目录,在目录中创建“com.facebook.presto.spi.Plugin”配置文件,Presto将会根据此配置文件找到对应的注册自定义函数类。在此文件中需要指定注册自定义函数的类:

com.lansonjy.prestocode.MyFunctionsPlugin

1.5、将项目打包,上传到Presto集群

将项目打包,上传到每台Presto节点的“$PRESTO_HOME/plugin/udf”目录下,默认udf目录没有,需要手动预先创建。所有Presto节点上传完成后,重启Presto集群。

1.6、使用自定义UDF函数

#登录Presto客户端
./presto --server node3:8080 --catalog mysql --schema presto_db

#查询所有函数
presto:presto_db> show functions;

#使用这个函数查询转换数据
presto:presto_db> select myudf('ABCDEF');
 _col0  
--------
 abcdef 
(1 row)

2、​​​​​​​UDAF函数

UDAF是自定义聚合函数,下面自定义一个UDAF实现计算平均数聚合函数功能,步骤如下:

2.1、在项目中创建“MyUDAF”类

package com.lansonjy.prestocode;

import com.facebook.presto.spi.block.BlockBuilder;
import com.facebook.presto.spi.function.*;
import com.facebook.presto.spi.type.DoubleType;
import com.facebook.presto.spi.type.StandardTypes;

//presto 自定义聚合函数实现-实现平均数计算
//自定义聚合函数使用时的名称
@AggregationFunction("myudaf")
//自定义聚合函数注释
@Description("我的自定义聚合函数,实现计算平均数")
public class MyUDAF {
    //输入数据注释
    @InputFunction
    public static void input(LongAndDoubleState state, @SqlType(StandardTypes.DOUBLE) double value) {
        //针对每条数据,执行 input 函数。这个过程是并行执行的,因此在每个有数据的节点都会执行,最终得到多个累积的状态数据。
        state.setLong(state.getLong() + 1);
        state.setDouble(state.getDouble() + value);
    }

    //聚合数据注释
    @CombineFunction
    public static void combine(LongAndDoubleState state, LongAndDoubleState otherState) {
        //将所有节点的状态数据聚合起来,多次执行,直至所有状态数据被聚合成一个最终状态,也就是 Aggregation 函数的输出结果。
        state.setLong(state.getLong() + otherState.getLong());
        state.setDouble(state.getDouble() + otherState.getDouble());
    }

    //输出数据注释
    @OutputFunction(StandardTypes.DOUBLE)
    public static void output(LongAndDoubleState state, BlockBuilder out) {
        //最终输出结果到一个 BlockBuilder。
        long count = state.getLong();
        if (count == 0) {
            out.appendNull();
        } else {
            double value = state.getDouble();
            DoubleType.DOUBLE.writeDouble(out, value / count);
        }
    }
}

以上类中涉及到了自定义类型LongAndDoubelState接口实现,此接口继承了AccumulatorState接口,对于简单的计算逻辑,只是获取设置值,那么可以定义简单接口来实现,里面只需要实现对应的get,set方法实现即可。对于复杂的计算逻辑需要自定义类实现接口,实现复杂的计算逻辑,代码如下:

package com.lansonjy.prestocode;

import com.facebook.presto.spi.function.AccumulatorState;

public interface LongAndDoubleState extends AccumulatorState {
    long getLong();

    void setLong(long value);

    double getDouble();

    void setDouble(double value);
}

2.2、在“MyFunctionPlugin”中注册UDAF

//Presto 注册自定义函数的类,此类需要继承Plugin接口
public class MyFunctionsPlugin implements Plugin {
    @Override
    public Set<Class<?>> getFunctions()
    {
        return ImmutableSet.<Class<?>>builder()
                //注册UDF,这里填写对应的UDF类
                .add(MyUDF.class)
                //注册UDAF,这里填写对应的UDAF 类
                .add(MyUDAF.class)
                .build();
    }
}

2.3、打包,上传到各个Presto

将项目打包,上传到每台Presto节点的“$PRESTO_HOME/plugin/udf”目录下,默认udf目录没有,需要手动预先创建。所有Presto节点上传完成后,重启Presto集群。

2.4、在presto中执行如下命令

#登录Presto客户端
[root@node3 presto-0.259]# ./presto --server node3:8080 --catalog mysql --schema presto_db

#查看函数
presto:presto_db> show functions;

#执行聚合查询
presto:presto_db> select pkg_name,myudaf(amount) as abc from machine_consume_detail group by pkg_name;

 

二、Presto JDBC连接

使用JDBC连接Presto需要在项目中导入以下依赖:

<dependency>
    <groupId>io.prestosql</groupId>
    <artifactId>presto-jdbc</artifactId>
    <version>312</version>
</dependency>

JDBC连接代码如下:

public class ReadDataFromPresto {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection conn = DriverManager.getConnection("jdbc:presto://node3:8080/mysql/presto_db","root",null);
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("select pkg_name,sum(amount) as total_amount from machine_consume_detail group by pkg_name");
        while (rs.next()) {
            String pkgName = rs.getString("pkg_name");
            double totalAmount = rs.getDouble("total_amount");
            System.out.println("pkgName = "+pkgName+",totalAmount="+totalAmount);
        }
        rs.close();
        conn.close();
    }
}

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 71 JavaScript JSON 71.5 JSON.parse()

JavaScript 文章目录JavaScript71 JavaScript JSON71.5 JSON.parse()71.5.1 实例 – 解析 JSON71.5.2 来自服务器的 JSON71.5.3 作为 JSON 的数组71.5.4 例外71.5.5 浏览器支持71 JavaScript JSON 71.5 JSON.parse() JSON 的常规用途是同 web 服务器进行数据传输。 在从 web…

Hive笔记-01 架构概述

文章目录1.概述2.Metadata/Metastore的作用3 Metastore三种配置方式3.1 Hive配置参数说明3.1.1 基本配置参数3.1.2 其他配置参数3.2 内嵌模式&#xff08;Embedded&#xff09; 3.2.1 hive-site.xml配置说明 3.2.2 hive-site.xml配置样例3.2.3 启动方式3.2.4 缺点3.3 本地模式&…

cmd常用命令行

前言 最近在看《深入剖析Tomcat》&#xff0c;其中涉及了常见的dos命令&#xff0c;这里做一些简单记录&#xff0c;其实跟linux命令很像。 案例 .bat&#xff1a;批处理文件 rem&#xff1a;用于注释&#xff0c;解释器不会执行以rem命令开始的行 - pause&#xff1a;暂停…

Executors工具类的相关方法

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生。本篇将记录创建线程池的Executors工具类里面的方法&#xff0c;方便加深知识印象和复习使用。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复习中&#xff0c;面试中的大佬&a…

Matlab之机载雷达系统中的空时自适应处理(STAP)技术(附源码)

目录 一、介绍 二、系统设置 2.1 天线定义 2.2 雷达设置 2.3 目标 2.4 杂波 2.5 传播路径 三、模拟循环 3.1真实目标范围、角度和多普勒 3.2 使用 DPCA 消除器进行杂波抑制 ​四、总结 五、程序 本例简要介绍了空时自适应处理&#xff08;STAP&#xff09;技术&…

【C++】模板进阶 —— 非类型模板参数 | 特化 | 模板的分离编译

&#x1f308;欢迎来到C专栏~~模板进阶 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&…

java线程基础

最近&#xff0c;想弄一个雪花飘落&#xff0c;结果&#xff0c;搞了两三个小时没弄出来。主要是雪花飘落可能需要用到线程。有人是通过一个雪花去实现&#xff0c;然后通过集合去实现漫天雪花。不管怎么说&#xff0c;做开发&#xff0c;可能线程学习也是一块绕不过去的大山。…

【JavaWeb】jsp

文章目录⭐️ 一.jsp概念及其作用⭐️ 二.jsp的本质⭐️三.jsp的三种语法⭐️四.jsp的九大内置对象⭐️五.jsp四大域对象⭐️六.jsp中的out输出和response.getWriter输出的区别⭐️七.jsp的常用标签⭐️八.Listener监听器⭐️ 一.jsp概念及其作用 1.概念:jsp的全称是java serv…

SpringMVC框架中的异常处理机制

目录 1. 什么是异常处理&#xff1f; 2. SpringMVC框架中的异常处理机制是什么&#xff1f; 3. SpringMVC框架汇中实现异常处理的实现步骤 4. SpringMVC框架出现异常时候的处理过程 5. 附手写代码&#xff0c;并含有注释 1. 什么是异常处理&#xff1f; http://t.csdn.cn/x…

【线性代数】四、二次型

第四章 二次型 文章目录第四章 二次型一、二次型定义二、合同变换1.线性变换2.矩阵合同标准型和规范型3.惯性定理三、正定二次型一、二次型定义 如果系数aij全为实数&#xff0c;那么为实二次型。上述二次型展开式可表示用矩阵为 可以看出&#xff0c;二次型矩阵A是一个对称矩…

做了8年前端,细说那些曾经让你浴霸不能的后端

说明&#xff1a;本文并没有针对某位大哥大姐&#xff0c;看见如果觉得好笑的就笑一笑&#xff0c;如果被戳中了你的过往&#xff0c;请不要气愤&#xff0c;人活着嘛&#xff0c;开心最重要。 A 曾经有个后端&#xff0c;我要调一个详情。他告诉我传id&#xff0c;然后测试的…

LeetCode 790. 多米诺和托米诺平铺

LeetCode 790. 多米诺和托米诺平铺一、题目&#xff08;经典动态规划&#xff09;二、解题思路1. 铺满2*N面积&#xff1a;2. 对于第i列&#xff0c;有4种情况&#xff1a;3. N-1 -> N 转移方程&#xff1a;三、核心代码四、代码中存在的一些知识性问题1. 二层vector的定义、…

浅谈JVM

内存结构&#xff1a; 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;记住下一条jvm指令的执行地址 特点&#xff1a; 是线程私有的 不会出现内存溢出 虚拟机栈 虚拟机栈&#xff1a;是描述java方法执行的内存模型&#xff0c;每个方法在执行的同时都会创建…

生信初学者必知的镜像设置

文章目录Ubuntu镜像conda镜像R语言镜像Python镜像Julia镜像国内网络问题很烂&#xff0c;大家都知道&#xff0c;github、pubmed这些网站经常访问不了&#xff01;如果你平常会用到Ubuntu、conda、R语言、Python、Julia&#xff0c; 那你肯定为安转各种包、库、软件而烦恼过&am…

​草莓熊python turtle绘图代码(玫瑰花版)附源代码

​草莓熊python turtle绘图代码&#xff08;玫瑰花版&#xff09;附源代码 目录 一、前言 二、草莓熊手持玫瑰花成品效果图 三、代码演示方法和代码命令解释 四、草莓熊手持的玫瑰花源代码 五、相关资源图片 六、我的“草莓熊python turtle绘图&#xff08;玫瑰花版&…

Sparse编码和字典学习(1)基础知识和python简单实现

Sparse编码和字典学习1. 稀疏表示与字典学习简介1.1 Motivation1.2 字典学习的流程1.3 字典学习的数学模型2 python实现2.1字典学习2.1 稀疏性统计和误差计算参考资料和文献1. 稀疏表示与字典学习简介 1.1 Motivation 字典学习的思想应该源来实际生活中的字典的概念。字典是前…

谷粒商城 -- 项目环境搭建

注&#xff1a;以下的项目环境搭建过程&#xff0c;适用于所有的微服务项目的环境搭建&#xff0c;以后做微服务项目的时候看着这个笔记进行搭建环境即可 一、项目微服务划分图 二、Linux安装Docker 三、Docker安装mysql / redis 四、Vscode下载安装 五、谷粒项目结构创建&a…

碎片化学习Python的又一神作:termux

什么是Termux&#xff1f; 据Termux官网介绍&#xff0c;Termux是一个Android终端仿真器和Linux环境应用程序&#xff0c;运行于内部存储&#xff08;不在SD卡上&#xff09;&#xff0c;无需root或设置。 系统自动进行最小化安装&#xff0c;使用APT软件包管理器安装其它软件…

【成为红帽工程师】第三天 web服务器

目录 一、www简介 二、网址及http简介 三、www服务器的类型 四、www服务器的基本配置 五、相关实验 一、www简介 &#xff08;一&#xff09;什么是www www是world wide web的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用www来查询 用户所需要的信息…

【十问十答】回归模型知识点

1. 线性回归的假设是什么 线性回归有四个假设&#xff1a; 线性&#xff1a;自变量&#xff08;x&#xff09;和因变量&#xff08;y&#xff09;之间应该存在线性关系&#xff0c;这意味着x值的变化也应该在相同方向上改变y值。 独立性&#xff1a;特征应该相互独立&#xf…