Flink 系列之三十三- Flink SQL - 中间算子:函数

之前做过数据平台,对于实时数据采集,使用了Flink。现在想想,在数据开发平台中,Flink的身影几乎无处不在,由于之前是边用边学,总体有点混乱,借此空隙,整理一下Flink的内容,算是一个知识积累,同时也分享给大家。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 Flink-1.19.x,Flink支持多种语言,这里的所有代码都是使用java,JDK版本使用的是19
代码参考:https://github.com/forever1986/flink-study.git

目录

  • 1 函数
    • 1.1 分类
    • 1.2 引用及调用顺序
    • 1.3 示例演示
    • 1.4 自定义函数

熟悉SQL的朋友应该使用过函数,函数其实可以理解例如在Data Stream API中进行一些自定义的process算子,只不过在SQL中包装成通用的函数,在FlinkSQL中也有很多定义好的函数,这一章来详细讲解FlinkSQL函数相关。

1 函数

1.1 分类

Flink SQL中函数的划分有2个标准:

  • 按是否内置: 系统内置函数Catalog 函数 。系统函数没有名称空间,只能通过其名称来进行引用。 Catalog 函数属于 Catalog 和数据库,因此它们拥有 Catalog 和数据库命名空间。 用户可以通过全/部分限定名(catalog.db.func 或 db.func)或者函数名 来对 Catalog 函数进行引用。
  • 按生命周期: 临时函数持久化函数 。 临时函数始终由用户创建,它容易改变并且仅在会话的生命周期内有效。 持久化函数不是由系统提供,就是存储在 Catalog 中,它在会话的整个生命周期内都有效。

因此按照这两个划分标准给 Flink 用户提供了 4 种函数:

  • 临时性系统函数
  • 系统函数
  • 临时性 Catalog 函数
  • Catalog 函数

1.2 引用及调用顺序

引用
在Flink SQL中,有精准引用和模糊引用。精确引用就是使用函数时写明哪个Catalog、哪个数据库的。精准引用允许用户跨 Catalog,跨数据库调用 Catalog 函数。而模糊引用则只是写上函数名。

引用顺序

  • 当你是精准引用,则会先匹配临时性 Catalog 函数,再去匹配Catalog 函数
  • 当你是模糊引用,则会按照该顺序匹配:临时性系统函数 -> 系统函数 -> 临时性Catalog 函数 -> Catalog 函数

Flink SQL中提供了很多的内置系统函数,具体可以参照《官方文档-函数》。

1.3 示例演示

在《官方文档-函数》中,将系统内置的函数分为标量函数和聚合函数,标量函数只是一个将字段进行转换,而聚合函数则是将多条数据聚合为一条。其中聚合函数在《系列之二十六 - 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;

Flink 系列之三十三- Flink SQL - 中间算子:函数_第1张图片

1.4 自定义函数

**自定义函数(UDF)**是一种扩展开发机制,可以用来在查询语句里调用难以用其他方式表达的频繁使用或自定义的逻辑。
FlinkSQL支持通过 JVM 语言(例如 Java 或 Scala)或 Python 实现,实现者可以在 UDF 中使用任意第三方库。由于目前都是基于sql-client客户端的开发模式,等后面讲到基于编程的SQL模式下,再补充说明自定义函数。

结语:本章通过了解FlinkSQL中如何使用函数,基本上也是和标准的SQL一致。下一章将讲解FlinkSQL的一些其它特有相关概念

你可能感兴趣的:(flink,flink,flinksql,函数,自定义函数)