Flink 系统内置函数(Built-in Functions)分类、典型用法与选型建议

1. 系统内置函数是什么

1.1 系统(Built-in)函数 是 Flink 默认提供、无需注册即可使用的一组函数,用于数据转换与分析。

1.2 当内置函数不够用时,你可以实现 用户自定义函数(UDF)。如果你认为某个函数足够通用,可以提 Jira 提案。

2. 函数大类总览(按能力域划分)

2.1 标量函数(Scalar Functions):输入 0/1/N 个值,输出 1 个值

2.2 聚合函数(Aggregate Functions):跨多行聚合,输出 1 个聚合结果

2.3 列函数(Column Functions,仅 Table API):用于"选择/排除列"

2.4 其它:命名参数(Named Arguments)、时间单位说明(Time Interval/Point Units)

3. 标量函数(Scalar Functions)

3.1 比较函数(Comparison)

这一类用于比较、判空、范围判断、LIKE/正则匹配、IN/EXISTS 等。

3.1.1 基本比较(注意 NULL)

  • =, <>, >, >=, <, <=:当任意一侧为 NULL,结果通常为 UNKNOWN
  • IS NULL / IS NOT NULL:专门用于判空

3.1.2 NULL 友好的等价判断

  • IS DISTINCT FROM:把 NULL 当作"可比较值",NULL 与 NULL 视为相同

    • NULL IS DISTINCT FROM NULL 为 FALSE
    • 1 IS DISTINCT FROM NULL 为 TRUE
  • IS NOT DISTINCT FROM:同理用于"相等"判断

    • NULL IS NOT DISTINCT FROM NULL 为 TRUE

3.1.3 范围判断

  • BETWEEN ... AND ...:支持 ASYMMETRIC(默认)与 SYMMETRIC(对称)
  • NOT BETWEEN ... AND ...:与 BETWEEN 相反

3.1.4 模式匹配

  • LIKE / NOT LIKE:支持 ESCAPE
  • SIMILAR TO / NOT SIMILAR TO:SQL 正则语义(注意部分 ESCAPE 能力尚未支持)

3.1.5 集合与子查询

  • IN (...) / NOT IN (...):列表中包含 NULL 时会出现 UNKNOWN 语义
  • EXISTS (sub-query):可被重写为 join + group 才支持;流式场景可能导致状态无限增长,需要配状态 TTL/保留策略
  • value IN (sub-query) / value NOT IN (sub-query):子查询返回集合参与判断

3.2 逻辑函数(Logical)

这一类的核心是 三值逻辑(TRUE/FALSE/UNKNOWN)

  • OR:任一 TRUE 即 TRUE(例如 TRUE OR NULL 为 TRUE)
  • AND:任一 FALSE 即 FALSE,但 TRUE AND NULL 为 UNKNOWN
  • NOT:对 UNKNOWN 仍为 UNKNOWN
  • IS TRUE / IS FALSE / IS UNKNOWN 及其 NOT 版本:用于精确判断三值逻辑状态

3.3 算术函数(Arithmetic)

常见数值运算与数学函数:

3.3.1 基本运算

  • + - * / %MOD(a,b)

3.3.2 常见数学函数

  • 幂与根:POWERSQRT
  • 对数:LNLOG10LOG2LOG(base, x)(对输入范围有约束)
  • 指数:EXP
  • 取整:CEIL/CEILINGFLOORROUND(x, n)TRUNCATE(x, n)
  • 三角函数:SIN/COS/TAN/COT 及反函数 ASIN/ACOS/ATAN/ATAN2
  • 角度弧度:DEGREESRADIANS
  • 常量与随机:PI()E()RAND()RAND(seed)RAND_INTEGER(...)
  • UUID:UUID()

3.3.3 编码相关

  • BIN(int):转二进制字符串
  • HEX(x) / UNHEX(expr):十六进制与二进制互转

3.3.4 百分位(PERCENTILE)

  • PERCENTILE(expr, percentage[, frequency]):连续分布百分位,必要时线性插值
  • 建议更适合 window 场景;普通 group aggregation 可能引发排序开销

3.4 字符串函数(String)

3.4.1 拼接与长度

  • ||CONCAT(...)CONCAT_WS(sep, ...)
  • CHAR_LENGTH / CHARACTER_LENGTH

3.4.2 大小写与位置

  • UPPERLOWERPOSITION(x IN y)INSTRLOCATE

3.4.3 Trim / Pad / Repeat

  • TRIMLTRIMRTRIMBTRIM
  • LPADRPAD
  • REPEAT

3.4.4 子串与替换

  • SUBSTRING / SUBSTR
  • REPLACE
  • OVERLAY

3.4.5 正则族(非常常用)

  • REGEXP_REPLACE
  • REGEXP_COUNT / EXTRACT / EXTRACT_ALL / INSTR / SUBSTR
  • REGEXP(str, regex):判断是否匹配

3.4.6 URL / Base64 / 编解码

  • URL_ENCODE/URL_DECODE
  • FROM_BASE64/TO_BASE64
  • ENCODE/DECODE(指定字符集)
  • PARSE_URL(支持提取 HOST/PATH/QUERY 等)

3.4.7 其它实用函数

  • STARTSWITHENDSWITH
  • REVERSE
  • SPLIT_INDEXSTR_TO_MAP
  • JSON 字符串转义:JSON_QUOTE/JSON_UNQUOTE
  • ELT(index, ...):按序取第 N 个表达式

3.5 时间与区间函数(Temporal)

3.5.1 字符串转时间

  • DATE strTIME strTIMESTAMP str
  • TO_DATE(str[, fmt])
    TO_TIMESTAMP(str[, fmt])
  • TO_TIMESTAMP_LTZ(epochOrStr[, ...])

3.5.2 当前时间(批/流语义不同)

  • LOCALTIMELOCALTIMESTAMPCURRENT_DATECURRENT_TIMESTAMPNOW()

  • 重要语义:

    • 流式:通常"每条记录计算一次"
    • 批式:通常"查询启动时计算一次"

3.5.3 抽取与日期字段

  • EXTRACT(unit FROM temporal)
  • YEAR/QUARTER/MONTH/WEEK/DAYOFYEAR/DAYOFMONTH/DAYOFWEEK/HOUR/MINUTE/SECOND

3.5.4 对齐时间单位

  • FLOOR(timepoint TO unit)
  • CEIL(timepoint TO unit)

3.5.5 时间间隔判断与转换

  • OVERLAPS

  • DATE_FORMAT(timestamp, pattern)(pattern 兼容 Java SimpleDateFormat)

  • TIMESTAMPDIFF(unit, t1, t2)

  • CONVERT_TZ(datetime, fromTz, toTz)

  • Unix 时间戳:

    • UNIX_TIMESTAMP()
    • UNIX_TIMESTAMP(str[, fmt])(注意时区解析规则)
    • FROM_UNIXTIME(sec[, fmt])

3.5.6 水位线

  • CURRENT_WATERMARK(rowtime):返回当前 watermark(可能为 NULL)

3.6 条件函数(Conditional)

  • CASE WHEN ... THEN ... ELSE ... END
  • NULLIF(a,b)
  • COALESCE(a,b,...)
  • IF(cond, x, y)
  • IFNULL(x, replacement):在 nullability 推导上更"具体"
  • GREATEST(...) / LEAST(...):任意参数为 NULL 则返回 NULL(这是常见坑)
  • 字符串判定:IS_ALPHAIS_DIGITIS_DECIMAL

3.7 类型转换函数(Type Conversion)

  • CAST(x AS type):失败会抛异常并失败作业
  • TRY_CAST(x AS type):失败返回 NULL,更适合脏数据场景
  • TYPEOF(expr[, force_serializable]):返回类型字符串(可用于调试、动态 schema 观察)

3.8 集合函数(Collection)

数组(ARRAY)常用:

  • CARDINALITY(array)array[INT] / ARRAY.at(INT)ELEMENT(array)
  • ARRAY_APPEND/PREPENDARRAY_CONTAINS
  • ARRAY_DISTINCTARRAY_POSITION
  • ARRAY_REMOVEARRAY_REVERSE
  • ARRAY_SLICE(支持正负索引、0 视为开头)
  • ARRAY_SORT(可控升降序与 NULL 位置)
  • ARRAY_UNION/EXCEPT/INTERSECT/CONCAT
  • ARRAY_MAX/ARRAY_MIN
  • ARRAY_JOIN

Map(MAP)常用:

  • CARDINALITY(map)map[key] / MAP.at(key)
  • MAP_KEYSMAP_VALUESMAP_ENTRIES
  • MAP_FROM_ARRAYS
  • MAP_UNION

字符串分割:

  • SPLIT(str, delimiter):返回 ARRAY

3.9 JSON 函数(JSON)

JSON 函数基于 SQL 标准 JSON Path,支持 strict/lax(默认 strict),并有已知限制(lax 并非所有特性都稳定)。

常用函数:

  • IS JSON [VALUE|SCALAR|ARRAY|OBJECT]

  • JSON_EXISTS(json, path [ ... ON ERROR ])

  • JSON_STRING(value):序列化成 JSON 字符串

  • JSON_VALUE(json, path ... ):取标量,可指定 RETURNING 与 ON EMPTY/ON ERROR 的兜底

  • JSON_QUERY(json, path ... ):取 JSON 片段,可控制 wrapper 与 onEmpty/onError

  • 构造函数:

    • JSON_OBJECT(...)
    • JSON_ARRAY(...)
    • JSON(value):仅可在 JSON_OBJECT/JSON_ARRAY 内用于插入"原样 JSON"
  • 聚合构造:

    • JSON_OBJECTAGG(KEY k VALUE v ...)
    • JSON_ARRAYAGG(expr ...)

Variant(变体类型):

  • PARSE_JSON / TRY_PARSE_JSON:将 JSON 字符串解析为 Variant

3.10 值构造与访问(Row/Array/Map/Descriptor/Object)

  • 行:(v1, v2, ...)ROW(v1, ...)
  • 数组:ARRAY[ ... ]
  • Map:MAP[ k1, v1, k2, v2, ... ]
  • DESCRIPTOR(col1, col2, ...):用于传列名列表(尤其 PTF)
  • OBJECT_OF(className, key, value, ...):构造结构化对象(需 classpath 可解析)

值访问:

  • composite.fieldCOMPOSITE.get(name/index)
  • flatten():把复合类型拉平为多列

3.11 Hash、Grouping 等

  • Hash:MD5SHA1SHA224/256/384/512SHA2(str, bitLen)
  • 分组标识:GROUP_ID()GROUPING(...)GROUPING_ID(...)

4. 聚合函数(Aggregate Functions)

这一类跨多行计算:

  • 计数:COUNT(*)COUNT(expr)COUNT(DISTINCT ...)

  • 数值聚合:AVGSUMMAXMIN

  • 方差标准差:VAR_POP/VAR_SAMP/VARIANCESTDDEV_POP/STDDEV_SAMP

  • 收集:COLLECTARRAY_AGG

  • 窗口分析函数(常与 OVER 搭配):

    • RANKDENSE_RANKROW_NUMBER
    • LAG/LEAD
    • FIRST_VALUE/LAST_VALUE
    • CUME_DISTPERCENT_RANKNTILE
  • 字符串聚合:LISTAGG

5. 时间区间与时间点单位(Units)

5.1 Table API 使用下划线替代空格(例如 DAY_TO_HOUR

5.2 SQL 里可用复数(YEARS

5.3 既有 interval unit,也有 time point unit(如 YEAR/MONTH/DAY/HOUR...)

6. 列函数(Column Functions,仅 Table API)

这部分只在 Table API 中用,SQL 里没有。

6.1 三个入口函数

  • withColumns(...):选择指定列
  • withoutColumns(...):排除指定列
  • withAllColumns():选择所有列(类似 SQL SELECT *

6.2 列表达方式

  • 按列名:"a"
  • 按列索引(从 1 开始)
  • 按范围:range(2, 4)range("a", "b")

6.3 一个典型组合例子(概念展示)

  • groupBy(withColumns(range(1, 3)))
  • select(withColumns(range("a","b")), myUDAgg(myUDF(withColumns(range(5, 20)))))

7. 命名参数(Named Arguments)

7.1 默认是 位置参数f(42, true)

7.2 若函数声明了静态签名(文档/DESCRIBE FUNCTION 中用 => 表示),可用 命名参数,例如:

sql 复制代码
SELECT MyUdf(input => my_column, threshold => 42);

7.3 命名参数的价值

  • 调用更清晰、顺序可交换
  • 可选参数不必强制填写
  • 但并非所有函数都支持(重载/varargs 等通常不支持)

8. 实战选型建议(快速决策)

8.1 脏数据转换:优先 TRY_CAST + COALESCE 做兜底,别让 CAST 直接把作业打挂

8.2 NULL 语义敏感的等值判断:优先 IS NOT DISTINCT FROM / IS DISTINCT FROM,避免 = 遇 NULL 变 UNKNOWN

8.3 JSON 解析:

  • 抽标量用 JSON_VALUE,抽片段用 JSON_QUERY
  • strict/lax 要明确,必要时配置 ON ERROR/ON EMPTY 的默认值
    8.4 流式 EXISTS/子查询:注意状态可能无限增长,需要配置合理的 state retention
相关推荐
天远云服2 小时前
Go 语言高并发实战:批量清洗天远借贷行为验证API (JRZQ8203) 的时间序列数据
大数据·api
AI营销实验室2 小时前
AI 工具何高质量的为销售线索打分?
大数据·人工智能
打码人的日常分享3 小时前
企业数据资产管控和数据治理解决方案
大数据·运维·网络·人工智能·云计算
数字冰雹3 小时前
从“东数西算”到智慧机房:数字孪生如何重塑数据中心的“智能大脑”?
大数据·人工智能·数据可视化
qq_348231853 小时前
市场快评 · 今日复盘要点20251224
大数据
TG:@yunlaoda360 云老大4 小时前
如何在华为云国际站代理商控制台进行SFS Turbo的基础状态核查?
大数据·服务器·华为云·php
Yyyyy123jsjs4 小时前
XAUUSD API 周末无推送,会影响回测与实盘一致性吗?
大数据·区块链
是Judy咋!4 小时前
Elasticsearch---单机部署
大数据·elasticsearch·搜索引擎
天辛大师4 小时前
2026年丙午年火马年周易运势与AI预测大模型启示录
大数据·人工智能·游戏·随机森林·启发式算法