函数
— 焉知非鱼Functions
函数
Flink Table API & SQL 使用户能够通过函数进行数据转换。
函数的类型 #
Flink 中的函数有两个维度来分类。
一个维度是系统(或内置)函数 v.s. 目录函数。系统函数没有命名空间,可以只用名字来引用。目录函数属于目录和数据库,因此它们有目录和数据库的命名空间,它们可以用完全/部分限定名(catalog.db.func
或 db.func
)或者只用函数名来引用。
另一个维度是临时函数 v.s. 持久化函数。临时函数是不稳定的,只存在于一个会话的生命周期内,它们总是由用户创建的。而持久性函数则是在会话的生命周期内存在的,它们要么是由系统提供的,要么是在目录中持久存在的。
这两个维度给 Flink 用户提供了4类函数。
- 临时系统函数
- 系统函数
- 临时目录函数
- 目录函数
引用函数 #
在 Flink 中,用户有两种引用函数的方式 - 精确引用函数或模棱两可的引用函数。
精确的函数引用 #
精确的函数引用使用户能够专门使用目录函数,并且跨目录和跨数据库,例如从 mytable
中选择 mycatalog.mydb.myfunc(x)
,从 mytable
中选择 mydb.myfunc(x)
。
这只从 Flink 1.10 开始支持。
模棱两可的函数引用 #
在模棱两可的函数引用中,用户只需在 SQL 查询中指定函数名称即可,例如:select myfunc(x) from mytable
。
函数解析顺序 #
只有当有不同类型但名称相同的函数时,解析顺序才是重要的,比如有三个函数都名为 “myfunc”,但分别是临时目录、目录和系统函数。如果没有函数名冲突,则函数将被解析为唯一的一个。
精确的函数引用 #
因为系统函数没有命名空间,所以 Flink 中的精确函数引用必须指向临时目录函数或目录函数。
其解析顺序是:
- 临时目录函数
- 目录函数
含糊不清的函数参考 #
解析顺序是:
- 临时系统函数
- 系统函数
- 临时目录函数,在当前目录和当前数据库中的会话。
- 目录函数,在当前目录和当前数据库中的会话。
原文链接: https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/functions/