SQL 方言通

首页 / 工具 / 迁移清单 / StarRocks → MaxCompute

StarRocks 迁移到 MaxCompute 的函数改写清单

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

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

需要改写的函数

函数StarRocks 写法MaxCompute 写法MaxCompute 说明
APPROX_COUNT_DISTINCTAPPROX_COUNT_DISTINCT(expr)别名 APPROX_DISTINCT(colname)MaxCompute 2.0 扩展函数,返回 BIGINT,文档写明会有 5% 的误差。
COLLECT_LISTARRAY_AGG(col [ORDER BY ...])支持 COLLECT_LIST(colname)值为 NULL 的行不参与计算,结果不保证顺序。官方建议拼接字符串时改用 WM_CONCAT。
COLLECT_SETARRAY_AGG(DISTINCT col)支持 COLLECT_SET(colname)返回去重后的数组,值为 NULL 的行不参与计算。
DATEADDTIMESTAMPADD(unit, n, datetime_expr)支持 DATEADD(date, delta, datepart)datepart 必须是常量,可选 yyyy、q、mm、week、dd、hh、mi、ss、ff3 等。返回类型与 date 相同。date 为 NULL 时报错,delta 或 datepart 为 NULL 时返回 NULL。2.0 数据类型版本下,字符串要先 CAST 成 DATETIME。
DATETRUNCdate_trunc('month', datetime)支持 DATETRUNC(date, date_part)返回类型与输入相同。单位支持 yyyy、q、mm、week、isoweek、dd、hh、mi、ss、ff3,week 默认从周一开始,也可以写 week(sunday)。
EXPLODEFROM t, UNNEST(arr) AS u(x)支持 EXPLODE(var)支持 array 和 map。同一个 SELECT 只能有一个 EXPLODE,也不能同时选其他列,不能与 GROUP BY 等一起使用。数组为 NULL 时不输出行。
FROM_JSONparse_json(str)支持 from_json(jsonStr, schema)schema 写法与建表时的类型一致,例如 'a bigint, b double'、'array<bigint>'、'map<string,string>'。返回 ARRAY、MAP 或 STRUCT。STRUCT 的 key 区分大小写,缺失的 key 返回 NULL,类型不匹配的值会被忽略。
GETDATENOW([p])支持 GETDATE()返回 DATETIME,以东八区时间为标准。同一条 SQL 中总是返回固定值,精度到秒;开启 2.0 数据类型后精度到毫秒。
LENGTHchar_length(str)支持 LENGTH(str)返回 BIGINT,输入不是 UTF-8 编码时返回 -1。按字节计算长度要用 LENGTHB。
MONTHS_BETWEENmonths_diff(expr1, expr2)支持 MONTHS_BETWEEN(end_date, start_date)返回 DOUBLE,end_date 晚于 start_date 时为正。两个日期都是月末时返回整数,否则按天数差除以 31 折算。
NVLIFNULL(expr1, expr2)支持 NVL(value, default_value)文档要求两个参数的数据类型一致。
SIZEarray_length(arr) / map_size(m)支持 SIZE(array_or_map)同一个函数可以处理 ARRAY 和 MAP,返回 INT。
SORT_ARRAYarray_sort(array)支持 SORT_ARRAY(a[, isasc])isasc 默认为 True,即升序,传 False 时降序。NULL 视为最小值。
TO_CHARDATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')支持 TO_CHAR(date, format)格式符为 yyyy、mm、dd、hh、mi、ss,也支持 %Y、%m 这类写法。日期输入时 format 必填。date 为 NULL 时报错,format 为 NULL 时返回 NULL。也可以传入 BIGINT、DOUBLE 等数值,直接转成字符串。
TO_DATEstr_to_date(str, format)支持 TO_DATE(date_str[, format])不传 format 时返回 DATE,传入 format 时返回 DATETIME。格式符为 yyyy、mm、dd、hh、mi、ss、ff3,format 必须包含 yyyy。
WM_CONCATGROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep])支持 WM_CONCAT(separator, colname)分隔符必须是常量且写在前面。支持 DISTINCT 和 WITHIN GROUP (ORDER BY ...),值为 NULL 的行不参与计算。

可以改用原生函数

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

函数StarRocks 写法MaxCompute 写法MaxCompute 说明
DECODECASE expr WHEN search THEN result ... ELSE default END支持 DECODE(expression, search, result[, search, result]...[, default])没有匹配且没有 default 时返回 NULL。所有 result 的类型必须一致,search 与 expression 的类型也必须一致,否则报错。在 DECODE 中 NULL 与 NULL 视为相等。

迁移注意事项

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

APPROX_COUNT_DISTINCT 近似去重计数

COLLECT_LIST 聚合为数组

COLLECT_SET 去重聚合为数组

DATEADD 按单位加减日期

DATETRUNC 日期截断

EXPLODE 数组展开为多行

FROM_JSON 按 schema 解析 JSON

GETDATE 获取当前时间

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

TO_CHAR 日期转字符串

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

DECODE 多值匹配

可以直接用的函数

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

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