SQL 方言通

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

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

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

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

需要改写的函数

函数Doris 写法Spark SQL 写法Spark SQL 说明
ADD_MONTHSMONTHS_ADD(date, nums)支持 add_months(start_date, num_months)Spark 1.5.0 起提供。add_months('2016-08-31', 1) 返回 2016-09-30。
DATEADDTIMESTAMPADD(unit, n, datetime_expr)需改写 ts + INTERVAL n HOURSpark 3.4.0 起有 dateadd(start_date, num_days),但只能加天数,没有单位参数。按小时、月等单位加减用 INTERVAL 字面量,按月也可以用 add_months。
FROM_JSONJSON_PARSE(json_str)支持 from_json(jsonStr, schema[, options])Spark 2.2.0 起提供。schema 用 DDL 字符串,例如 'a INT, b DOUBLE'。options 可以指定 timestampFormat 等解析选项。
GET_JSON_OBJECTGET_JSON_STRING(json_str, json_path)支持 get_json_object(json_txt, path)从 Spark 1.5.0 起提供。
GETDATENOW([precision])别名 current_timestamp() 或 now()返回查询开始执行时的时间戳,同一查询中各次调用结果相同。3.4.0 起还有不带时区的 localtimestamp()。
LENGTHCHAR_LENGTH(str)支持 length(expr)返回字符数,包含末尾的空格;对二进制数据返回字节数。字节数用 octet_length。
SIZEARRAY_SIZE(arr) / MAP_SIZE(m)支持 size(expr)Spark 1.5.0 起提供,同时有别名 cardinality。输入为 NULL 时,只有关闭 ANSI 模式并开启 spark.sql.legacy.sizeOfNull 才返回 -1,否则返回 NULL。最新文档写明默认配置下返回 NULL。
SORT_ARRAYARRAY_SORT(arr)支持 sort_array(array[, ascendingOrder])Spark 1.5.0 起提供。升序时 NULL 在开头,降序时 NULL 在末尾。另有 array_sort,它把 NULL 放在末尾,3.0.0 起支持比较函数。
SPLITSPLIT_BY_STRING(str, separator)支持 split(str, regex[, limit])Spark 1.5.0 起提供,按正则拆分,limit 限制数组的最大长度。
SUBSTRSUBSTRING(str, pos[, len])支持 substr(str, pos[, len])Spark 1.5.0 起提供,与 substring 相同。负数从末尾倒数:substr('Spark SQL', -3) 返回 SQL。
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] str[, sep] [ORDER BY ...])需改写 string_agg(expr[, delimiter]) WITHIN GROUP (ORDER BY ...)string_agg 和 listagg 从 Spark 4.0.0 起提供。更早的版本用 concat_ws(',', collect_list(expr))。

可以改用原生函数

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

函数Doris 写法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) 用于按字符集解码。

迁移注意事项

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

ADD_MONTHS 按月加减

DATEADD 按单位加减日期

FROM_JSON 按 schema 解析 JSON

GET_JSON_OBJECT 提取 JSON 字段

GETDATE 获取当前时间

LENGTH 字符串长度

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

SPLIT 字符串拆分

SUBSTR 截取子串

TO_CHAR 日期转字符串

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

DECODE 多值匹配

可以直接用的函数

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

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