首页 / 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))。 |