SQL 方言通

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

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

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

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

需要改写的函数

函数StarRocks 写法Spark SQL 写法Spark SQL 说明
COLLECT_LISTARRAY_AGG(col [ORDER BY ...])支持 collect_list(expr)Spark 2.0.0 起提供,结果顺序不确定。3.3.0 起另有同义的 array_agg。
COLLECT_SETARRAY_AGG(DISTINCT col)支持 collect_set(expr)Spark 2.0.0 起提供。文档注明结果顺序取决于 shuffle 后的行序,是不确定的。
DATEADDTIMESTAMPADD(unit, n, datetime_expr)需改写 ts + INTERVAL n HOURSpark 3.4.0 起有 dateadd(start_date, num_days),但只能加天数,没有单位参数。按小时、月等单位加减用 INTERVAL 字面量,按月也可以用 add_months。
EXPLODEFROM t, UNNEST(arr) AS u(x)支持 explode(expr)Spark 1.0.0 起提供。数组默认列名为 col,map 为 key 和 value。需要保留空数组的行时用 explode_outer。
FROM_JSONparse_json(str)支持 from_json(jsonStr, schema[, options])Spark 2.2.0 起提供。schema 用 DDL 字符串,例如 'a INT, b DOUBLE'。options 可以指定 timestampFormat 等解析选项。
GETDATENOW([p])别名 current_timestamp() 或 now()返回查询开始执行时的时间戳,同一查询中各次调用结果相同。3.4.0 起还有不带时区的 localtimestamp()。
LENGTHchar_length(str)支持 length(expr)返回字符数,包含末尾的空格;对二进制数据返回字节数。字节数用 octet_length。
MONTHS_BETWEENmonths_diff(expr1, expr2)支持 months_between(timestamp1, timestamp2[, roundOff])Spark 1.5.0 起提供。同一天或都是月末时忽略时间部分,否则按每月 31 天计算,默认保留 8 位小数,roundOff 为 false 时不舍入。
NVLIFNULL(expr1, expr2)支持 nvl(expr1, expr2)Spark 2.0.0 起提供,同时有 ifnull、nvl2 和 coalesce。
SIZEarray_length(arr) / map_size(m)支持 size(expr)Spark 1.5.0 起提供,同时有别名 cardinality。输入为 NULL 时,只有关闭 ANSI 模式并开启 spark.sql.legacy.sizeOfNull 才返回 -1,否则返回 NULL。最新文档写明默认配置下返回 NULL。
SORT_ARRAYarray_sort(array)支持 sort_array(array[, ascendingOrder])Spark 1.5.0 起提供。升序时 NULL 在开头,降序时 NULL 在末尾。另有 array_sort,它把 NULL 放在末尾,3.0.0 起支持比较函数。
TO_CHARDATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')支持 to_char(expr, format)Spark 3.4.0 起提供。4.0 文档写明 expr 可以是日期时间,此时 format 使用 Java 风格格式符;更早的版本请按所用版本文档确认。也可以直接用 date_format。
TO_DATEstr_to_date(str, format)支持 to_date(date_str[, fmt])Spark 1.5.0 起提供。解析失败返回 NULL,省略 fmt 时按 CAST 规则转换。
WM_CONCATGROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep])需改写 string_agg(expr[, delimiter]) WITHIN GROUP (ORDER BY ...)string_agg 和 listagg 从 Spark 4.0.0 起提供。更早的版本用 concat_ws(',', collect_list(expr))。

可以改用原生函数

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

函数StarRocks 写法Spark SQL 写法Spark SQL 说明
DECODECASE expr WHEN search THEN result ... ELSE default END支持 decode(expr, search, result [, search, result ] ... [, default])多值匹配写法 3.2.0 起支持。没有匹配且省略 default 时返回 NULL。同名的 decode(bin, charset) 用于按字符集解码。

迁移注意事项

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

COLLECT_LIST 聚合为数组

COLLECT_SET 去重聚合为数组

DATEADD 按单位加减日期

EXPLODE 数组展开为多行

FROM_JSON 按 schema 解析 JSON

GETDATE 获取当前时间

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

TO_CHAR 日期转字符串

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

DECODE 多值匹配

可以直接用的函数

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

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