Flink自定义函数之标量函数(UDF函数)

news2025/1/20 15:48:00

1.背景

flink本身给我们提供了大量的内置函数,已经能满足我们绝大部分的需求,但是如果确实是碰到了一些特殊的场景,无法满足我们的需求的时候,我们可以使用自定义函数来解决。

自定义函数大致可以分为标量函数(UDF函数)、表值函数(UDTF函数)、聚合函数(UDAGG函数)和表值聚合函数(UDTAGG函数)。

flink内置函数可通过官网进行查询,不同版本有不同的内置函数,当前我们使用的是Flink1.12,具体查询内置函数地址如下:

Apache Flink 1.12 Documentation: System (Built-in) Functions

2.标量函数(UDF函数)

自定义标量函数可以把 0 到多个标量值映射成 1 个标量值,数据类型里列出的任何数据类型都可作为求值方法的参数和返回值类型。

定义标量函数

  1. 必须扩展org.apache.flink.Table.function中的基类ScalarFunction和实现(一个或多个)评估方法。
  2. 必须公开声明一个评估方法并命名为eval。评估方法的参数类型和返回类型也决定标量函数的参数和返回类型。可以通过实现名为eval的多个评估方法来重载评估方法。评估方法支持变量参数,比如eval(String…str)。评估方法必须是 public 的,而且名字必须是 eval。

示例代码,以下实现的是String类型日期字符串转换成时间戳:

import org.apache.flink.table.functions.ScalarFunction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;


public class getTimeMillis extends ScalarFunction {
    private static final Logger LOG = LoggerFactory.getLogger(getTimeMillis.class);

    /**
     * @param input 输入参数
     * @return 返回参数
     */
    public Long eval(String input) {
        Long output = 0000000000000L;
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            Date date = simpleDateFormat.parse(input);
            output = date.getTime();

        } catch (Exception e) {
            LOG.error(e.toString());
        }
        return output;
    }
}

默认情况下,评估方法的结果类型由Flink的类型提取工具决定。对于基本类型或简单pojo,这已经足够了。但是对于更复杂的、自定义的或复合类型,这可能是错误的。在这些情况下,可以通过通过重写ScalarFunction 的 getResultType()手动定义结果类型的类型信息。

3.生成JAR

在大多数情况下,必须先注册用户定义的函数,然后才能在查询中使用它。TableEnvironment通过调用registerFunction()方法来注册函数。使用第三方平台,可直接导入jar包进行使用。

我使用的是IDEA,IDEA导出JAR包过程如下所示:

1.右键项目,选择“Open Module Settings”;

2.选择Artifacts,点击“+”号,选择JAR,点击From modules with dependencies;

3.无main class可直接点击OK。

 4.可根据自己的需要添加外部依赖包,点击OK;

 5.项目编写完成后,点击Build ——> Build Artifacts,即可在out目录下看到生成的JAR包。

 

 

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

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

相关文章

Linux-安装Python2.7

一、简介 正常情况下,使用sudo apt install python来安装就好了。如果发现这个指令报错了,此时就需要手动安装Python2.7了。例如报错如下: 二、实操 1.下载Python2.7的相关源码(以2.7.18为例) 下载地址如下&#xff1a…

Linux第四章

文章目录 前言一、快捷键小技巧二、软件安装三、systemctl控制软件启动关闭四、软链接五、日期和时区六、ip地址和主机名七、配置linux固定ip地址八、网络请求和下载九、端口十、进程管理十一、主机状态监控十二、环境变量十三、linux文件的上传和下载十四、压缩和解压总结 前言…

第五章 使用RAID与LVM磁盘阵列技术

第五章 使用RAID与LVM磁盘阵列技术 一、RAID磁盘冗余阵列 1、部署磁盘阵列 (1)、RAID0、1、5、10方案技术对比 RAID级别最少硬盘可用容量读写性能安全性特点02nn低追求最大容量和速度,任何一块盘损坏,数据全部异常。12n/2n高追…

魔兽世界服务端用户注册以及网页的搭建教程

魔兽世界服务端用户注册以及网页的搭建教程 大家好我是艾西,上一章我们讲解了怎么编译一个魔兽的服务端以及安装最后进到我们自己的游戏。那么在平时娱乐的同时肯定是需要和朋友们一起玩游戏才会更有意思,那么今天艾西教大家怎么搭建用户注册页面以及网…

java进程引发的内存泄露问题排查分析

近期工作过程中遇到了一次容器内存不断增高,最终达到90%引发告警的情况。 特征1,把监控面板时间轴拉长会发现,重启后内存占用78%左右,每天增长1%,大约2周后会涨到90%触发告警(即如果2周内有代码发布部署&am…

2022-04-27:用go语言重写ffmpeg的remuxing.c示例。

2022-04-27:用go语言重写ffmpeg的remuxing.c示例。 答案2022-04-27: ffmpeg的remuxing.c是一个用于将多媒体文件从一种容器格式转换为另一种容器格式的命令行工具。它可以将音频、视频和字幕等元素从源文件中提取出来,并按照用户指定的方式…

构造函数和析构函数

1.构造函数 1.1 .构造函数概括 、构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。 构造函数是特殊的成员函数&#xff0c…

简单认识 Postman界面操作

查看本文前 您需要先登录Postman 如果还没有处理好 可以先查看我的文章 Postman登录注册指导 右上角的 Home 代表主页 就是我们现在看到的这个界面 Workspaces 是一个工作空间管理 这里 我们选择进入 我的工作空间 之后 我们所有的接口请求 就都是在这一块完成的 Collection…

ubuntu中安装VMware Tools,实现Windows文件拖入Ubuntu

ubantu作为一款非常好用的Linux发行版本,深受广大开发者的喜爱😃,为了开发的方便,人们常常在windows电脑中安装VMware虚拟机来运行Linux系统,我们时常会遇到这样一种情况:无法互传虚拟机与主机文件。 原因就…

终端连接工具Tabby的下载、安装与配置

目录 一、终端连接工具Tabby的下载1.1、Tabby的下载地址1.2、Tabby的下载步骤 二、终端连接工具Tabby的安装三、终端连接工具Tabby的SSH连接四、终端连接工具Tabby的SFTP 传输工具4.1、服务器上的文件传输到本地电脑4.2、本地电脑的文件传输到服务器 五、终端连接工具Tabby的设…

基于网络爬虫和SpringBoot框架的晋江文学小说小型网站项目

一、Python网路爬虫技术的设计与实现 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,常可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。项目中,主要采取Scrapy框架实现一个爬虫,抓…

JavaSE3(4/26)

目录 1.线程的状态 2.线程安全问题 3.synchronized的具体用法 4. 1.线程的状态 首先明白进程的状态:就绪或者阻塞 上述说的就绪和阻塞其实是针对系统中的线程状态(PCB) Java中对于Thread类中的线程的状态进行了进一步的细化 NEW: Thread对象有了,但是线程还没有被执行 TERMI…

RabbitMQ之介绍以及安装

1.1 MQ的相关概念 1.1.1 什么是MQ ​ MQ,从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ…

摄影tips

一、基础知识 相机挡位 A档就是全自动模式或称场景智能自动模式,该拍摄模式下,相机会根据光线和你所拍摄的对象等场景环境自行设置快门、光圈等参数,你不需要调整任何参数,拿起相机对焦按快门就行,也就是AUTO模式。虽…

opengauss编译和使用oracle_fdw

opengauss虽然继承自postgresql9.2,但由于做了魔改,网上通用的从oracle_fdw源码编译安装到postgresql的方法,是否成功的应用到opengauss,并不一定,今天试了一下,参照opengauss官网文档(其实写的…

Spring Bean的作用域及生命周期

目录 前言: Bean的作用域(Scope) 单例模式 原型模式(多例作用域) 请求作用域(request) 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结: 前…

多模态论文串讲:ALBEF VLMo BLIP CoCa Beit V3

文章目录 前言ALBEF:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation(2021-10)VLMO: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts(2021-11)relatedmethod BLIP:Bootstrapping Language-Im…

【贴片SD Card介绍】贴片SD Card (LEILONG雷龙科技)

有幸申请到了雷龙科技代理的 贴片 SD Card (SD NAND) 样品,做出测试,分享一下。 型号:CSNP32GCR01-BOW;CSNP4GCR01-BOW 生产方:CS创世半导体 由于是第一次使用贴片类型的 SD Card ,可能文章会有较多疏忽。…

【Git】Windows Git和TortoiseGit安装教程(Git2.23.0、TortoiseGit2.8.0、语言包2.8.0)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

eletron+react+antd+node开发桌面小程序并打包(electron-packager+electron-builder)

首先罗列一下项目中用到的技术: electron, react,antd, typescript, node,及打包命令:pkg,electron-packager,electron-builder及child_process实现多进程 需求:开发一个桌面应用,左…