持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
背景
在 flink SQL API中 flink 官方提供了很多系统内置函数供我们使用,但是在多变的业务场景下,并不是所有的 系统内置函数都能满足我们的需求,比如在业务场景中,我们经常需要对身份证信息进行加密在保存,这时我们就需要对身份证字段根据某个加密算法进行加密。 UDF 自定义函数功能就是为这种场景而生,当系统内置函数不满足需求时,我们可以自定义 UDF 函数,然后在 SQL 中直接使用。
UDF 实现的几种方式
udf 提供 5 种自定义方式,在实际业务中,我们根据业务需求继承对应的 Function,并实现对应的方法。
-
标量函数 将标量值转换成一个新标量值;简单理解就是 一对一模式,比如输入一个身份证号码,输出一个加密的字符串,实现(ScalarFunction),重写 eval() 方法。
-
表值函数 将标量值转换成新的行数据;简单理解就是一对多模式,比如一个字段存储为 逗号隔开的字符串,可通过(TableFunction)进行 split,输出多条数据。
-
聚合函数 将多行数据里的标量值转换成一个新标量值; 多对一模式,通过聚合操作把多行输出为一个值。(AggregateFunction)
-
表值聚合函数 将多行数据里的标量值转换成新的行数据;多对多模式,通过聚合分组得到新的结果集。(
TableAggregateFunction) -
异步表值函数 是异步查询外部数据系统的特殊函数。比如在业务上,用户id 和姓名存储 redis ,某个表只存储用户id字段,当想实现通过id 获取名称时,可实现此函数,获取外部数据系统数据,获得所需数据。(RichFunction)
实践一波
实现自定义的 UDF 功能主要分为以下几个步骤:
1、自定义 UDF 函数的实现逻辑,打包成 jar 包
2、上传 jar 包 到 flink 工程的 lib 目录下
3、使用 Flink 中的 SQL API 直接进行使用
1、自定义 UDF 函数
-
创建 maven 工程 ,pom 中引入
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-common</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency>
-
定义一个对字符串进行截取的函数,比如 5个字符截取1到 3位的字符
package com.example.flink.udf; import org.apache.flink.table.functions.ScalarFunction; // 定义函数逻辑 public class SubstringFunction extends ScalarFunction { public String eval(String s, Integer begin, Integer end) { return s.substring(begin, end); } }
-
使用 maven 进行打包
mvn clean packagen
得到一个 jar 包
2、上传 jar 包 到 flink 工程的 lib 目录下
-
把第一步生成的 jar 包上传到 lib 目录下
3、使用
CREATE TABLE products(
id INT,
name STRING,
description STRING,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://127.0.0.1:3306/demo',
'username' = 'root',
'password' = '123456',
'table-name' = 'products'
);
//创建 function
CREATE FUNCTION SubstringFunction as 'com.example.flink.udf.SubstringFunction';
//使用
SELECT id,name,SubstringFunction(name,1,3) AS substr from products;
-
执行结果
结论
以上主要介绍了如何自定义定义 flink 中的 UDF 函数,并在 sql 中直接进行使用,而不是使用 TABLE API 进行使用,希望对于要在 SQL 中直接使用 UDF 函数的同学有所帮助。对了,以上实践 demo,使用的 flink 版本为 1.14.4。flink 近年发展比较迅速,版本之间差异比较大,有问题,欢迎交流。
更多细节 flink 官网