SQL 方言通

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

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

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

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

需要改写的函数

函数Flink SQL 写法Hologres 写法Hologres 说明
ADD_MONTHSTIMESTAMPADD(MONTH, n, timepoint)需改写 d + interval '1 month'ADD_MONTHS 是 Oracle 兼容函数,需要先加载 orafce 扩展。原生写法用 interval 加减。
ANY_VALUEFIRST_VALUE(expression)需改写 MAX(col)通用聚合函数中没有 ANY_VALUE。组内值都相同时,可以用 MAX 或 MIN 代替。
DATE_ADDTIMESTAMPADD(DAY, n, timepoint)需改写 DATEADD(d, num, 'day')文档中没有 DATE_ADD,可以用 DATEADD 或 d + interval。DATEADD 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。
DATE_FORMATDATE_FORMAT(timestamp, format)需改写 TO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS')文档中没有 DATE_FORMAT,用 TO_CHAR 代替。格式符是 PostgreSQL 风格,HH 默认是 12 小时制,24 小时制要写 HH24。
DATE_SUBTIMESTAMPADD(DAY, -n, timepoint)需改写 d - interval '1 day'文档中没有 DATE_SUB。可以用日期减 interval,也可以写 DATEADD(d, -n, 'dd')。DATEADD 需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。
DATEADDTIMESTAMPADD(unit, n, timepoint)支持 DATEADD(d, num, str)需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。单位写法与 MaxCompute 一致,包括 yyyy、mm、dd、hh、mi、ss。默认只支持 1925~2282 年,并且暂不支持常量入参写入。
DATEDIFFTIMESTAMPDIFF(DAY, timepoint1, timepoint2)支持 DATEDIFF(d1, d2, unit)需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。不足一个单位时返回 0,不允许所有参数都是常量。DATE 相减也可以直接得到天数。
DATETRUNCFLOOR(timepoint TO MONTH)需改写 DATE_TRUNC('month', ts)单位在前,返回 TIMESTAMP 或 TIMESTAMPTZ。
DAYOFWEEKDAYOFWEEK(date)需改写 EXTRACT(DOW FROM ts) + 1DOW 以周日为 0,所以要加 1 才和其他引擎一致。ISODOW 以周一为 1、周日为 7。
FROM_JSONJSON_VALUE(json, path) / JSON_QUERY(json, path)需改写 json_str::jsonb ->> 'key'没有 FROM_JSON。先转成 JSON 或 JSONB,再用 -> 或 ->> 取字段,->> 返回 TEXT。需要展开成多列时可以用 json_populate_record。
FROM_UNIXTIMEFROM_UNIXTIME(numeric[, string])需改写 TO_TIMESTAMP(seconds)文档中没有 FROM_UNIXTIME。TO_TIMESTAMP(double precision) 按秒转换,返回 TIMESTAMPTZ。需要字符串时再用 TO_CHAR。
GET_JSON_OBJECTJSON_VALUE(json, path)支持 GET_JSON_OBJECT(json, json_path)属于 hive_compatible 扩展,使用前需要先执行 CREATE EXTENSION。
INSTRINSTR(string1, string2)需改写 STRPOS(str, substr)INSTR 是 Oracle 兼容函数,需要先安装 orafce 扩展才能用,支持起始位置和第 N 次出现。不装扩展时用 STRPOS。
LAST_DAYTIMESTAMPADD(DAY, -1, TIMESTAMPADD(MONTH, 1, FLOOR(ts TO MONTH)))支持 LAST_DAY(ts)需要 V2.0.31~V2.1.0 或 V2.1.13 及以上版本。
LENGTHCHAR_LENGTH(string)支持 LENGTH(str)按 UTF-8 字符计数,一个汉字、数字或字母都算 1,结果与 CHAR_LENGTH 相同。字节数用 OCTET_LENGTH。
MONTHS_BETWEENTIMESTAMPDIFF(MONTH, start, end)需改写 (EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b)日期函数中没有 MONTHS_BETWEEN,可以用 EXTRACT 取年和月计算整数月差,不含小数部分。
NVLIFNULL(input, null_replacement)需改写 COALESCE(value, default_value)条件函数文档中没有 NVL,只有 COALESCE、IF、NULLIF 等,需要改写为 COALESCE。
PERCENTILE_APPROXPERCENTILE(expr, percentage[, frequency])需改写 APPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)Hologres V3.1 起提供,用蓄水池抽样计算,最多保留 8,192 个元素。p 是 0~1 之间的常量。
REGEXP_EXTRACTREGEXP_EXTRACT(string1, string2[, integer])需改写 (REGEXP_MATCH(str, pattern))[n]字符串函数中没有 REGEXP_EXTRACT。REGEXP_MATCH 返回由各分组组成的数组,再用数组下标取第 n 组,下标从 1 开始。
SIZECARDINALITY(array_or_map)需改写 ARRAY_LENGTH(arr, 1)第二个参数是维度,从 1 开始,一维数组传 1。数组函数文档只覆盖 ARRAY。
SPLITSPLIT(string, delimiter)需改写 REGEXP_SPLIT_TO_ARRAY(str, pattern)字符串函数中没有 SPLIT。拆成数组用 REGEXP_SPLIT_TO_ARRAY,只取第 n 段用 SPLIT_PART(str, delimiter, n)。
SPLIT_PARTSPLIT_INDEX(str, delimiter, n - 1)支持 SPLIT_PART(str, delimiter, num)下标从 1 开始。num 超出分段数量时返回 NULL。
STR_TO_MAPSTR_TO_MAP(string1[, string2, string3])不支持 字符串函数中没有 STR_TO_MAP。
SUBSTRSUBSTR(string, integer1[, integer2])需改写 SUBSTRING(str FROM start FOR len)SUBSTR 是 Oracle 兼容函数,需要先加载 orafce 扩展。PostgreSQL 标准写法是 SUBSTRING。
TO_CHARDATE_FORMAT(timestamp, 'yyyy-MM-dd HH:mm:ss')支持 TO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS')格式符沿用 PostgreSQL 风格。HH 默认是 12 小时制,24 小时制要写 HH24。默认只支持 1925~2282 年。
UNIX_TIMESTAMPUNIX_TIMESTAMP(string1[, string2])需改写 EXTRACT(EPOCH FROM ts)日期函数中没有 UNIX_TIMESTAMP。EXTRACT 的 epoch 字段返回秒数,类型是 DOUBLE PRECISION。
WEEKOFYEARWEEK(date)需改写 EXTRACT(WEEK FROM ts)也可以用 week_iso(ts),文档说明语义与 EXTRACT(WEEK FROM ts) 相同、性能更好。返回 DOUBLE PRECISION。
WM_CONCATLISTAGG(expression[, separator])需改写 STRING_AGG(expression, delimiter)分隔符写在后面,只拼接非 NULL 值。

可以改用原生函数

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

函数Flink SQL 写法Hologres 写法Hologres 说明
APPROX_COUNT_DISTINCTCOUNT(DISTINCT expr)支持 APPROX_COUNT_DISTINCT(column)基于 HyperLogLog,平均误差 0.1%~1%。精度由 hg_experimental_approx_count_distinct_precision 控制,取值 12~20,默认 17。精确去重也可以用 UNIQ,它在带 GROUP BY 时比 COUNT DISTINCT 快。
MAX_BYROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1支持 MAX_BY(x, y)V1.3.36 起提供,同时有 MIN_BY。

迁移注意事项

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

ADD_MONTHS 按月加减

DATE_FORMAT 日期格式化

DATEADD 按单位加减日期

DATEDIFF 日期差

DATETRUNC 日期截断

DAYOFWEEK 星期几

FROM_UNIXTIME 时间戳转日期

GET_JSON_OBJECT 提取 JSON 字段

INSTR 查找子串位置

LAST_DAY 当月最后一天

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

PERCENTILE_APPROX 近似分位数

REGEXP_EXTRACT 正则提取

SIZE 数组和 Map 元素个数

SPLIT 字符串拆分

SPLIT_PART 按分隔符取第 N 段

STR_TO_MAP 字符串转 Map

SUBSTR 截取子串

TO_CHAR 日期转字符串

UNIX_TIMESTAMP 日期转时间戳

WEEKOFYEAR 一年中的第几周

APPROX_COUNT_DISTINCT 近似去重计数

可以直接用的函数

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

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