数仓 SQL 函数对照

首页 / Spark SQL

Spark SQL 函数写法

Spark SQL 常用函数的写法和注意事项,以及迁移到其他数仓引擎时需要改写的地方。

函数用途支持写法说明
ADD_MONTHS 按月加减 支持 add_months(start_date, num_months) Spark 1.5.0 起提供。add_months('2016-08-31', 1) 返回 2016-09-30。
ANY_VALUE 取组内任意值 支持 any_value(expr[, isIgnoreNull]) Spark 3.4.0 起提供,结果不确定。isIgnoreNull 为 true 时只返回非 NULL 值,默认可能返回 NULL。
COLLECT_LIST 聚合为数组 支持 collect_list(expr) Spark 2.0.0 起提供,结果顺序不确定。3.3.0 起另有同义的 array_agg。
COLLECT_SET 去重聚合为数组 支持 collect_set(expr) Spark 2.0.0 起提供。文档注明结果顺序取决于 shuffle 后的行序,是不确定的。
CONCAT 字符串拼接 支持 concat(col1, col2, ..., colN) Spark 1.5.0 起提供,2.4.0 起也可以拼接数组。文档没有说明 NULL 的处理方式。
CONCAT_WS 按分隔符拼接 支持 concat_ws(sep[, str | array(str)]+) Spark 1.5.0 起提供,跳过 NULL 值;分隔符为 NULL 时返回 NULL。
DATE_ADD 日期加减 支持 date_add(start_date, num_days) Spark 1.5.0 起提供。3.4.0 起另有同义的 dateadd。
DATE_FORMAT 日期格式化 支持 date_format(timestamp, fmt) Spark 1.5.0 起提供。
DATEDIFF 日期差 支持 datediff(endDate, startDate) Spark 1.5.0 起提供。3.4.0 起另有同义的 date_diff。
DATETRUNC 日期截断 需改写 date_trunc('MONTH', ts) date_trunc 从 2.3.0 起提供,单位在前,返回 timestamp。只需要日期时可以用 trunc(date, fmt)。
EXPLODE 数组展开为多行 支持 explode(expr) Spark 1.0.0 起提供。数组默认列名为 col,map 为 key 和 value。需要保留空数组的行时用 explode_outer。
FROM_UNIXTIME 时间戳转日期 支持 from_unixtime(unix_time[, fmt]) Spark 1.5.0 起提供,结果按会话时区显示。
GET_JSON_OBJECT 提取 JSON 字段 支持 get_json_object(json_txt, path) 从 Spark 1.5.0 起提供。
IF 条件判断 支持 if(expr1, expr2, expr3) Spark 1.0.0 起提供。
LAST_DAY 当月最后一天 支持 last_day(date) Spark 1.5.0 起提供。
MAX_BY 取最大值对应的列 支持 max_by(x, y[, k]) 传入 k 时返回 y 最大的前 k 个 x 组成的数组,k 最大 100,000。y 全为 NULL 时返回 NULL。
MAX_PT 取最新分区 不支持 — 函数索引中没有 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。
NVL 空值替换 支持 nvl(expr1, expr2) Spark 2.0.0 起提供,同时有 ifnull、nvl2 和 coalesce。
REGEXP_REPLACE 正则替换 支持 regexp_replace(str, regexp, rep[, position]) Spark 1.5.0 起提供,使用 Java 正则,替换全部匹配。position 指定从第几个字符开始查找。
SPLIT 字符串拆分 支持 split(str, regex[, limit]) Spark 1.5.0 起提供,按正则拆分,limit 限制数组的最大长度。
SUBSTR 截取子串 支持 substr(str, pos[, len]) Spark 1.5.0 起提供,与 substring 相同。负数从末尾倒数:substr('Spark SQL', -3) 返回 SQL。
TO_DATE 字符串转日期 支持 to_date(date_str[, fmt]) Spark 1.5.0 起提供。解析失败返回 NULL,省略 fmt 时按 CAST 规则转换。
UNIX_TIMESTAMP 日期转时间戳 支持 unix_timestamp([timeExp[, fmt]]) Spark 1.5.0 起提供,默认格式 yyyy-MM-dd HH:mm:ss。另有 to_unix_timestamp。
WM_CONCAT 分组拼接字符串 需改写 string_agg(expr[, delimiter]) WITHIN GROUP (ORDER BY ...) string_agg 和 listagg 从 Spark 4.0.0 起提供。更早的版本用 concat_ws(',', collect_list(expr))。