SQL 方言通

首页 / 工具 / 迁移清单 / Hologres → Flink SQL

Hologres 迁移到 Flink SQL 的函数改写清单

从 Hologres 迁移到 Flink SQL 时,在 Hologres 有对应写法的 43 个常用函数中,26 个需要改写(其中 1 个在 Flink SQL 没有对应函数),另有 4 个可以改用 Flink SQL 的原生函数。逐个列出两边写法和注意事项。

需要改写的函数 · 可以改用原生函数 · 迁移注意事项 · 可以直接用的函数 · 反向:Flink SQL 迁移到 Hologres

需要改写的函数

函数Hologres 写法Flink SQL 写法Flink SQL 说明
ADD_MONTHSd + interval '1 month'需改写 TIMESTAMPADD(MONTH, n, timepoint)内置函数中没有 ADD_MONTHS,用 TIMESTAMPADD 的 MONTH 单位。
ANY_VALUEMAX(col)需改写 FIRST_VALUE(expression)内置函数中没有 ANY_VALUE,可以用聚合函数 FIRST_VALUE 代替。
APPROX_COUNT_DISTINCTAPPROX_COUNT_DISTINCT(column)需改写 COUNT(DISTINCT expr)内置函数文档中没有近似去重函数,只能用精确的 COUNT(DISTINCT)。
DATE_ADDDATEADD(d, num, 'day')需改写 TIMESTAMPADD(DAY, n, timepoint)内置函数中没有 DATE_ADD,改用 TIMESTAMPADD。
DATE_FORMATTO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS')支持 DATE_FORMAT(timestamp, format)按格式字符串把 TIMESTAMP 转换为字符串。
DATE_SUBd - interval '1 day'需改写 TIMESTAMPADD(DAY, -n, timepoint)内置函数中没有 DATE_SUB,用 TIMESTAMPADD 传负数。
DATEADDDATEADD(d, num, str)需改写 TIMESTAMPADD(unit, n, timepoint)单位可以是 SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或 YEAR。
DATEDIFFDATEDIFF(d1, d2, unit)需改写 TIMESTAMPDIFF(DAY, timepoint1, timepoint2)内置函数中没有 DATEDIFF。TIMESTAMPDIFF 返回 timepoint1 与 timepoint2 之间带符号的单位数,先写单位,再写开始时间和结束时间。
DATETRUNCDATE_TRUNC('month', ts)需改写 FLOOR(timepoint TO MONTH)内置函数中没有 DATE_TRUNC,用 FLOOR ... TO 向下取整到指定单位。
FROM_JSONjson_str::jsonb ->> 'key'需改写 JSON_VALUE(json, path) / JSON_QUERY(json, path)没有 FROM_JSON。JSON_VALUE 取标量值,JSON_QUERY 取对象或数组,返回 JSON 字符串。
FROM_UNIXTIMETO_TIMESTAMP(seconds)支持 FROM_UNIXTIME(numeric[, string])返回字符串,默认格式 yyyy-MM-dd HH:mm:ss,结果按会话时区表示。
GET_JSON_OBJECTGET_JSON_OBJECT(json, json_path)需改写 JSON_VALUE(json, path)提取 JSON 中的标量值,可以用 RETURNING 子句指定返回类型。
INSTRSTRPOS(str, substr)支持 INSTR(string1, string2)任一参数为 NULL 时返回 NULL。需要起始位置时用 LOCATE(string1, string2, integer),找不到时返回 0。
LAST_DAYLAST_DAY(ts)需改写 TIMESTAMPADD(DAY, -1, TIMESTAMPADD(MONTH, 1, FLOOR(ts TO MONTH)))内置函数中没有 LAST_DAY。先用 FLOOR 取当月第一天,加一个月再减一天。
LENGTHLENGTH(str)别名 CHAR_LENGTH(string)返回字符数,别名 CHARACTER_LENGTH。内置函数中没有 LENGTH。
MAX_BYMAX_BY(x, y)需改写 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1内置函数中没有 MAX_BY 或 ARG_MAX,用 ROW_NUMBER 窗口函数改写。
MAX_PTMAX_PT('table_name')不支持 内置函数中没有 MAX_PT。流式作业没有“最新分区”的概念,批模式下可以用子查询改写。
MONTHS_BETWEEN(EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b)需改写 TIMESTAMPDIFF(MONTH, start, end)没有 MONTHS_BETWEEN。TIMESTAMPDIFF 返回 timepoint2 减 timepoint1 的整数,参数顺序与 MONTHS_BETWEEN 相反。
NVLCOALESCE(value, default_value)需改写 IFNULL(input, null_replacement)没有 NVL,可以用 IFNULL 或 COALESCE。
PERCENTILE_APPROXAPPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)需改写 PERCENTILE(expr, percentage[, frequency])PERCENTILE 是精确分位数,按线性插值计算。2.0 起的文档中有这个函数,1.20 的文档中没有,使用前请按所用版本确认。文档提示在普通分组聚合中开销较大,建议用在窗口场景。
REGEXP_EXTRACT(REGEXP_MATCH(str, pattern))[n]支持 REGEXP_EXTRACT(string1, string2[, integer])分组下标从 1 开始,0 表示整个匹配,下标不能超过定义的分组数。
SIZEARRAY_LENGTH(arr, 1)别名 CARDINALITY(array_or_map)数组返回元素个数,Map 返回键值对个数。
SPLITREGEXP_SPLIT_TO_ARRAY(str, pattern)支持 SPLIT(string, delimiter)字符串或分隔符为 NULL 时返回 NULL。只取第 n 段可以用 SPLIT_INDEX。
SPLIT_PARTSPLIT_PART(str, delimiter, num)需改写 SPLIT_INDEX(str, delimiter, n - 1)下标从 0 开始。下标为负数或任一参数为 NULL 时返回 NULL。
TO_CHARTO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS')需改写 DATE_FORMAT(timestamp, 'yyyy-MM-dd HH:mm:ss')没有 TO_CHAR。DATE_FORMAT 的格式符兼容 Java SimpleDateFormat。
WM_CONCATSTRING_AGG(expression, delimiter)需改写 LISTAGG(expression[, separator])分隔符写在后面。

可以改用原生函数

下面的函数在 Hologres 中只能用替代写法,Flink SQL 有对应的函数。原来的写法通常仍能运行,换成原生函数会更简洁。

函数Hologres 写法Flink SQL 写法Flink SQL 说明
DAYOFWEEKEXTRACT(DOW FROM ts) + 1支持 DAYOFWEEK(date)返回 1~7,等价于 EXTRACT(DOW FROM date)。文档示例中 1994-09-27(周二)返回 3,即周日为 1。
SUBSTRSUBSTRING(str FROM start FOR len)支持 SUBSTR(string, integer1[, integer2])也可以写 SUBSTRING。省略长度时截取到末尾。
UNIX_TIMESTAMPEXTRACT(EPOCH FROM ts)支持 UNIX_TIMESTAMP(string1[, string2])默认格式 yyyy-MM-dd HH:mm:ss。不带参数时返回当前时间的秒数。
WEEKOFYEAREXTRACT(WEEK FROM ts)别名 WEEK(date)返回 1~53,等价于 EXTRACT(WEEK FROM date)。

迁移注意事项

以下内容摘自各函数页中提到 Hologres 或 Flink SQL 的注意事项。

ADD_MONTHS 按月加减

APPROX_COUNT_DISTINCT 近似去重计数

DATE_FORMAT 日期格式化

DATEADD 按单位加减日期

DATEDIFF 日期差

DATETRUNC 日期截断

FROM_UNIXTIME 时间戳转日期

GET_JSON_OBJECT 提取 JSON 字段

INSTR 查找子串位置

LAST_DAY 当月最后一天

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

PERCENTILE_APPROX 近似分位数

REGEXP_EXTRACT 正则提取

SIZE 数组和 Map 元素个数

SPLIT 字符串拆分

SPLIT_PART 按分隔符取第 N 段

TO_CHAR 日期转字符串

DAYOFWEEK 星期几

SUBSTR 截取子串

UNIX_TIMESTAMP 日期转时间戳

WEEKOFYEAR 一年中的第几周

可以直接用的函数

下面 13 个函数在两个引擎中写法相同。参数、返回值和边界情况仍可能不同,点开函数页查看细节。

相关页面:Hologres 函数写法 · Flink SQL 函数写法 · 全部迁移清单 · 用 SQL 迁移检查器检查自己的 SQL