之前做过数据平台,对于实时数据采集,使用了Flink。现在想想,在数据开发平台中,Flink的身影几乎无处不在,由于之前是边用边学,总体有点混乱,借此空隙,整理一下Flink的内容,算是一个知识积累,同时也分享给大家。
注意:由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 Flink-1.19.x,Flink支持多种语言,这里的所有代码都是使用java,JDK版本使用的是19。
代码参考:https://github.com/forever1986/flink-study.git
熟悉SQL的朋友应该使用过函数,函数其实可以理解例如在Data Stream API中进行一些自定义的process算子,只不过在SQL中包装成通用的函数,在FlinkSQL中也有很多定义好的函数,这一章来详细讲解FlinkSQL函数相关。
Flink SQL中函数的划分有2个标准:
因此按照这两个划分标准给 Flink 用户提供了 4 种函数:
引用:
在Flink SQL中,有精准引用和模糊引用。精确引用就是使用函数时写明哪个Catalog、哪个数据库的。精准引用允许用户跨 Catalog,跨数据库调用 Catalog 函数。而模糊引用则只是写上函数名。
引用顺序:
Flink SQL中提供了很多的内置系统函数,具体可以参照《官方文档-函数》。
在《官方文档-函数》中,将系统内置的函数分为标量函数和聚合函数,标量函数只是一个将字段进行转换,而聚合函数则是将多条数据聚合为一条。其中聚合函数在《系列之二十六 - Flink SQL - 中间算子:普通聚合》中已经讲过,这里就不再累述。下面演示几个常用的标量函数
字符串函数:字符串函数在数据处理中较为常见,这些和标准SQL基本上一样
SET sql-client.execution.result-mode=TABLEAU;
select 'Flink' || 'SQL' as tmp;
select UPPER('Flink') as tmp;
select LTRIM(' Flink') as tmp;
select REPEAT('FlinkSQL', 3) as tmp;
select SUBSTRING('FlinkSQL' FROM 0 FOR 5) as tmp;
select REPLACE('Hello SQL', 'SQL', 'Flink') as tmp;
**自定义函数(UDF)**是一种扩展开发机制,可以用来在查询语句里调用难以用其他方式表达的频繁使用或自定义的逻辑。
FlinkSQL支持通过 JVM 语言(例如 Java 或 Scala)或 Python 实现,实现者可以在 UDF 中使用任意第三方库。由于目前都是基于sql-client客户端的开发模式,等后面讲到基于编程的SQL模式下,再补充说明自定义函数。
结语:本章通过了解FlinkSQL中如何使用函数,基本上也是和标准的SQL一致。下一章将讲解FlinkSQL的一些其它特有相关概念