首页 / 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 的结果,顺序不固定。 |