数仓 SQL 函数对照

首页 / Hive

Hive 函数写法

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

函数用途支持写法说明
ADD_MONTHS 按月加减 支持 add_months(start_date, num_months[, output_date_format]) Hive 1.1.0 起提供,返回 string。Hive 4.0.0 之前会忽略时间部分,4.0.0 起可以指定输出格式。
ANY_VALUE 取组内任意值 需改写 max(col) 函数手册中没有 ANY_VALUE,组内值都相同时用 max 或 min 代替。
COLLECT_LIST 聚合为数组 支持 collect_list(col) Hive 0.13.0 起提供,保留重复值。
COLLECT_SET 去重聚合为数组 支持 collect_set(col) 返回去重后的 array。
CONCAT 字符串拼接 支持 concat(str1, str2, ...) 也可以拼接 binary。函数手册没有说明 NULL 的处理方式。
CONCAT_WS 按分隔符拼接 支持 concat_ws(SEP, A, B, ...) 也支持 concat_ws(SEP, array<string>),数组写法从 Hive 0.9.0 起提供。
DATE_ADD 日期加减 支持 date_add(startdate, days) Hive 2.1.0 之前返回 string,之后返回 date。
DATE_FORMAT 日期格式化 支持 date_format(ts, pattern) Hive 1.2.0 起提供,输入可以是 date、timestamp 或 string。
DATEDIFF 日期差 支持 datediff(enddate, startdate) 返回 int,表示从 startdate 到 enddate 的天数。
DATETRUNC 日期截断 需改写 trunc(date, 'MM') 函数手册中没有 date_trunc。trunc 只支持 MONTH、MON、MM 和 YEAR、YYYY、YY,返回 string。
EXPLODE 数组展开为多行 支持 explode(array | map) UDTF,数组展开为一列 col,map 展开为 key 和 value 两列。需要元素位置时用 posexplode,位置从 0 开始。
FROM_UNIXTIME 时间戳转日期 支持 from_unixtime(unixtime[, pattern]) 输入为距 1970-01-01 00:00:00 UTC 的秒数,返回 string。
GET_JSON_OBJECT 提取 JSON 字段 支持 get_json_object(json_string, path)
IF 条件判断 支持 if(testCondition, valueTrue, valueFalseOrNull)
LAST_DAY 当月最后一天 支持 last_day(date) Hive 1.1.0 起提供,返回 string。
MAX_BY 取最大值对应的列 需改写 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1 函数手册中没有 MAX_BY,用窗口函数取每组第一行。
MAX_PT 取最新分区 不支持 — 函数手册中没有 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。
NVL 空值替换 支持 NVL(value, default_value) Hive 0.11 起提供。
REGEXP_REPLACE 正则替换 支持 regexp_replace(INITIAL_STRING, PATTERN, REPLACEMENT) 使用 Java 正则,替换全部匹配。
SPLIT 字符串拆分 支持 split(str, pat) 返回 array,pat 是正则表达式。
SUBSTR 截取子串 支持 substr(str, start[, len]) substr('foobar', 4) 返回 bar。手册没有说明负数和 0 的处理。
TO_DATE 字符串转日期 需改写 to_date(from_unixtime(unix_timestamp(str, pattern))) Hive 的 to_date 只返回时间戳字符串的日期部分,没有格式参数。返回类型在 Hive 2.1.0 之前是 string,之后是 date。
UNIX_TIMESTAMP 日期转时间戳 支持 unix_timestamp(date[, pattern]) 返回秒级 bigint。不带参数取当前时间的写法从 Hive 2.0 起已不推荐,建议用 CURRENT_TIMESTAMP。
WM_CONCAT 分组拼接字符串 需改写 concat_ws(',', collect_list(col)) 函数手册中没有 WM_CONCAT,用 concat_ws 拼接 collect_list 的结果,顺序不固定。