SQL 方言通

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

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

从 Flink SQL 迁移到 StarRocks 时,在 Flink SQL 有对应写法的 43 个常用函数中,15 个需要改写,另有 3 个可以改用 StarRocks 的原生函数。逐个列出两边写法和注意事项。

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

需要改写的函数

函数Flink SQL 写法StarRocks 写法StarRocks 说明
ADD_MONTHSTIMESTAMPADD(MONTH, n, timepoint)支持 add_months(date, months)返回 DATETIME,DATE 输入也会转成 DATETIME。目标月份没有对应日期时返回当月最后一天,例如 2022-01-31 加 1 个月得到 2022-02-28。
DATE_ADDTIMESTAMPADD(DAY, n, timepoint)支持 DATE_ADD(date, INTERVAL n DAY)文档只列出 INTERVAL 写法。返回 DATETIME,DATE 输入也会转成 DATETIME。结果日期不存在时返回 NULL。
DATE_SUBTIMESTAMPADD(DAY, -n, timepoint)支持 DATE_SUB(date, INTERVAL n DAY)别名 subdate。返回 DATETIME。结果日期不存在时返回 NULL,例如 2010-02-30。只传天数时可以用 days_sub(d, n)。
DATEDIFFTIMESTAMPDIFF(DAY, timepoint1, timepoint2)支持 DATEDIFF(expr1, expr2)结果为 expr1 减 expr2,只按天计算,忽略时间部分。需要其他单位时用 date_diff。
DATETRUNCFLOOR(timepoint TO MONTH)需改写 date_trunc('month', datetime)单位在前且必须是常量。DATE 输入只能截断到 year、quarter、month、week、day。
FROM_JSONJSON_VALUE(json, path) / JSON_QUERY(json, path)需改写 parse_json(str)没有 FROM_JSON。parse_json 返回 JSON 类型,而不是 STRUCT 或 MAP。字符串不是合法 JSON 时返回 NULL。取字段可以接 json_query 或 -> 运算符。
GET_JSON_OBJECTJSON_VALUE(json, path)支持 get_json_object(json_str, json_path)文档中 get_json_string 和 get_json_object 是同一条目,返回字符串。需要保留 JSON 类型时用 json_query 或箭头操作符。
LAST_DAYTIMESTAMPADD(DAY, -1, TIMESTAMPADD(MONTH, 1, FLOOR(ts TO MONTH)))支持 last_day(date[, unit])3.1 起提供,返回 DATE。unit 可以是 month、quarter 或 year,默认 month。
MONTHS_BETWEENTIMESTAMPDIFF(MONTH, start, end)需改写 months_diff(expr1, expr2)函数列表中没有 MONTHS_BETWEEN。months_diff 返回 expr1 减 expr2 的月数,类型是 BIGINT,只精确到月;日期不存在时返回 NULL。
PERCENTILE_APPROXPERCENTILE(expr, percentage[, frequency])支持 PERCENTILE_APPROX(expr, p[, compression])p 可以是单个值或数组。compression 取 2048~10000,不传或超出范围时按 10000 计算,值越大越精确,内存占用也越多。
SIZECARDINALITY(array_or_map)别名 array_length(arr) / map_size(m)数组用 array_length,别名 cardinality,3.0 起提供,NULL 元素也计入长度,输入为 NULL 时返回 NULL。Map 用 map_size,2.5 起提供,别名同样是 cardinality。
SPLIT_PARTSPLIT_INDEX(str, delimiter, n - 1)支持 split_part(content, delimiter, field)正数从开头数,负数从末尾数,-1 表示最后一段。下标越界时,官方示例返回空字符串。
TO_DATETO_DATE(string1[, string2])需改写 str_to_date(str, format)StarRocks 的 to_date 只接受 DATETIME 并取日期部分,不能解析字符串。按格式解析用 str_to_date,格式符与 date_format 相同;格式只含日期时返回 DATE,否则返回 DATETIME。
WEEKOFYEARWEEK(date)支持 WEEKOFYEAR(date)返回 INT。文档没有说明周的划分规则;需要 ISO 周时可以用 week_iso。
WM_CONCATLISTAGG(expression[, separator])需改写 GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep])默认分隔符是逗号,跳过 NULL。结果长度受 group_concat_max_len 限制,默认 1,024 个字符,超出部分会被截断。

可以改用原生函数

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

函数Flink SQL 写法StarRocks 写法StarRocks 说明
ANY_VALUEFIRST_VALUE(expression)支持 ANY_VALUE(expr)返回值不确定。3.2 起支持 ARRAY、MAP 和 STRUCT 类型。
APPROX_COUNT_DISTINCTCOUNT(DISTINCT expr)支持 APPROX_COUNT_DISTINCT(expr)结果近似于 COUNT(DISTINCT col),使用固定大小的内存,适合高基数列。
MAX_BYROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1支持 max_by(x, y)2.5 起提供。y 为 NULL 的行被忽略,并列时返回最先遇到的 x。y 不能是 bitmap、hll 等不可排序的类型。

迁移注意事项

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

ADD_MONTHS 按月加减

DATE_ADD 日期加减

DATE_SUB 日期减天数

DATEDIFF 日期差

DATETRUNC 日期截断

FROM_JSON 按 schema 解析 JSON

GET_JSON_OBJECT 提取 JSON 字段

LAST_DAY 当月最后一天

MONTHS_BETWEEN 相差月数

PERCENTILE_APPROX 近似分位数

SIZE 数组和 Map 元素个数

SPLIT_PART 按分隔符取第 N 段

TO_DATE 字符串转日期

WEEKOFYEAR 一年中的第几周

WM_CONCAT 分组拼接字符串

APPROX_COUNT_DISTINCT 近似去重计数

MAX_BY 取最大值对应的列

可以直接用的函数

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

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