首页 / Flink SQL
Flink SQL 函数写法
Flink SQL 常用函数的写法和注意事项,以及迁移到其他数仓引擎时需要改写的地方。
| 函数 | 用途 | 支持 | 写法 | 说明 |
|---|---|---|---|---|
| ADD_MONTHS | 按月加减 | 需改写 | TIMESTAMPADD(MONTH, n, timepoint) |
内置函数中没有 ADD_MONTHS,用 TIMESTAMPADD 的 MONTH 单位。 |
| ANY_VALUE | 取组内任意值 | 需改写 | FIRST_VALUE(expression) |
内置函数中没有 ANY_VALUE,可以用聚合函数 FIRST_VALUE 代替。 |
| COLLECT_LIST | 聚合为数组 | 需改写 | ARRAY_AGG(expression) |
没有输入行时返回 NULL,可以用 RESPECT NULLS 或 IGNORE NULLS 控制是否保留 NULL。 |
| COLLECT_SET | 去重聚合为数组 | 需改写 | ARRAY_AGG(DISTINCT expression) |
也可以用 COLLECT(DISTINCT expression),返回的是 MULTISET 而不是数组。 |
| CONCAT | 字符串拼接 | 支持 | CONCAT(string1, string2, ...) |
任一参数为 NULL 时返回 NULL。 |
| CONCAT_WS | 按分隔符拼接 | 支持 | CONCAT_WS(string1, string2, string3, ...) |
第一个参数是分隔符,为 NULL 时返回 NULL;其余参数中的 NULL 会被跳过。 |
| DATE_ADD | 日期加减 | 需改写 | TIMESTAMPADD(DAY, n, timepoint) |
内置函数中没有 DATE_ADD,改用 TIMESTAMPADD。 |
| DATE_FORMAT | 日期格式化 | 支持 | DATE_FORMAT(timestamp, format) |
按格式字符串把 TIMESTAMP 转换为字符串。 |
| DATEDIFF | 日期差 | 需改写 | TIMESTAMPDIFF(DAY, timepoint1, timepoint2) |
内置函数中没有 DATEDIFF。TIMESTAMPDIFF 返回 timepoint1 与 timepoint2 之间带符号的单位数,先写单位,再写开始时间和结束时间。 |
| DATETRUNC | 日期截断 | 需改写 | FLOOR(timepoint TO MONTH) |
内置函数中没有 DATE_TRUNC,用 FLOOR ... TO 向下取整到指定单位。 |
| EXPLODE | 数组展开为多行 | 需改写 | CROSS JOIN UNNEST(arr) AS t(x) |
内置函数中没有 EXPLODE,数组展开写在 JOIN 中:CROSS JOIN UNNEST,也支持 LEFT JOIN。需要元素位置时加 WITH ORDINALITY,位置从 1 开始,目前只支持 CROSS JOIN。也可以展开 map 和 multiset。 |
| FROM_UNIXTIME | 时间戳转日期 | 支持 | FROM_UNIXTIME(numeric[, string]) |
返回字符串,默认格式 yyyy-MM-dd HH:mm:ss,结果按会话时区表示。 |
| GET_JSON_OBJECT | 提取 JSON 字段 | 需改写 | JSON_VALUE(json, path) |
提取 JSON 中的标量值,可以用 RETURNING 子句指定返回类型。 |
| IF | 条件判断 | 支持 | IF(condition, true_value, false_value) |
|
| LAST_DAY | 当月最后一天 | 需改写 | TIMESTAMPADD(DAY, -1, TIMESTAMPADD(MONTH, 1, FLOOR(ts TO MONTH))) |
内置函数中没有 LAST_DAY。先用 FLOOR 取当月第一天,加一个月再减一天。 |
| MAX_BY | 取最大值对应的列 | 需改写 | ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1 |
内置函数中没有 MAX_BY 或 ARG_MAX,用 ROW_NUMBER 窗口函数改写。 |
| MAX_PT | 取最新分区 | 不支持 | — | 内置函数中没有 MAX_PT。流式作业没有“最新分区”的概念,批模式下可以用子查询改写。 |
| NVL | 空值替换 | 需改写 | IFNULL(input, null_replacement) |
没有 NVL,可以用 IFNULL 或 COALESCE。 |
| REGEXP_REPLACE | 正则替换 | 支持 | REGEXP_REPLACE(string1, string2, string3) |
替换全部匹配的子串。 |
| SPLIT | 字符串拆分 | 支持 | SPLIT(string, delimiter) |
字符串或分隔符为 NULL 时返回 NULL。只取第 n 段可以用 SPLIT_INDEX。 |
| SUBSTR | 截取子串 | 支持 | SUBSTR(string, integer1[, integer2]) |
也可以写 SUBSTRING。省略长度时截取到末尾。 |
| TO_DATE | 字符串转日期 | 支持 | TO_DATE(string1[, string2]) |
默认格式为 'yyyy-MM-dd'。 |
| UNIX_TIMESTAMP | 日期转时间戳 | 支持 | UNIX_TIMESTAMP(string1[, string2]) |
默认格式 yyyy-MM-dd HH:mm:ss。不带参数时返回当前时间的秒数。 |
| WM_CONCAT | 分组拼接字符串 | 需改写 | LISTAGG(expression[, separator]) |
分隔符写在后面。 |