2、将打包好的jar 放到flink 集群的lib 目录下,需要重启flink 集群
前言
Flink 是目前最流行的一款流批一体的大数据计算引擎,目前已被广泛的使用在各大厂的线上环境中,社区也是不断的迭代更新中,本系列文章主要是用来本人自己学习Flink 过程记录和心得及总结。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Flink Sql 的UDF
用户定义函数(udf)是用于调用在查询中无法以其他方式表示的常用逻辑或自定义逻辑的扩展点。用户定义函数可以用JVM语言(如Java或Scala)或Python实现。实现者可以在UDF中使用任意第三方库。本页将重点讨论基于jvm的语言,请参阅PyFlink文档以获得关于用Python编写通用和向量化udf的详细信息。
目前,Flink区分了以下几种功能:
- 标量函数将标量值映射到一个新的标量值。
- 表函数将标量值映射到新行。
- 聚合函数将多行标量值映射为一个新的标量值。
- 表聚合函数将多行的标量值映射到新行。
- 异步表函数是用于执行查找的表源的特殊函数。
以下主要介绍标量(Scalar)UDF的实现。
二、定义 UDF
1. 创建UDF maven工程,build 为jar
①、工程需要引用以下pom 依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.14.0</version>
<scope>provided</scope>
</dependency>
②、以我们使用到的to_json 函数为例,创建以下类,实现Flink 的ScalarFunction 函数
public class ToJsonFunction extends ScalarFunction {
public String getName() {
return "to_json";
}
public String eval(@DataTypeHint(inputGroup = InputGroup.ANY) Object... fields) {
final int length = fields.length;
final JSONObject jsonObject = new JSONObject();
for (int i = 0; i < length; i++) {
if ((i & 1) == 0) {
jsonObject.put(fields[i].toString(), fields[i + 1]);
}
}
return jsonObject.toJSONString();
}
}
2、将打包好的jar 放到flink 集群的lib 目录下,需要重启flink 集群
3、先需要声明函数
CREATE FUNCTION to_json AS 'com.shuyun.dpe.flink.udf.ToJsonFunction';
4、如何使用to_json 函数?
-- 创建表结构
CREATE TABLE standard_order (
header MAP<STRING, STRING>, --map 结构
payload STRING --json 字符串
) WITH (
'connector' = 'filesystem',
'path' = 'file:Volumes/soft/calc-engine/apache-flink-1.14.0/data/order.txt',
'format' = 'json'
);
--执行含有to_json 函数的sql
select to_json('plat_account', plat_account) from (select json_value(payload, '$.plat_account') as plat_account from standard_order) as temp;
--ps: to_json函数的参数如果是''引起来的char,则查询出来就是具体的值,否则必须是列名,否则会提示:
--[ERROR] Could not execute SQL statement. Reason:
--org.apache.calcite.sql.validate.SqlValidatorException: Column 'v1' not found in any table
原始数据如下:
{"header":{"shop_id":"123123123","tenant_id":"tenant_test_name"},"payload":"{\"plat_account\":\"test_platAccount\",\"uni_id\":\"test_uniId\"}"}
执行结果如下:
Flink SQL> select to_json('plat_account', plat_account) from (select json_value(payload, '$.plat_account') as plat_account from standard_order) as temp;
+----+--------------------------------+
| op | EXPR$0 |
+----+--------------------------------+
| +I | {"plat_account":"test_platA... |
+----+--------------------------------+
总结
以上就是今天要讲的内容,本文仅仅简单介绍了标量udf怎么定义和使用,后续文章会讲解其他udf 的使用。