SQL 方言通

首页 / 工具 / 迁移清单 / Hologres → Hive

Hologres 迁移到 Hive 的函数改写清单

从 Hologres 迁移到 Hive 时,在 Hologres 有对应写法的 43 个常用函数中,24 个需要改写(其中 1 个在 Hive 没有对应函数),另有 5 个可以改用 Hive 的原生函数。逐个列出两边写法和注意事项。

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

需要改写的函数

函数Hologres 写法Hive 写法Hive 说明
ADD_MONTHSd + interval '1 month'支持 add_months(start_date, num_months[, output_date_format])Hive 1.1.0 起提供,返回 string。Hive 4.0.0 之前会忽略时间部分,4.0.0 起可以指定输出格式。
APPROX_COUNT_DISTINCTAPPROX_COUNT_DISTINCT(column)需改写 COUNT(DISTINCT col)内置函数文档中没有近似去重函数,只能用精确的 COUNT(DISTINCT)。
COLLECT_LISTARRAY_AGG(expression)支持 collect_list(col)Hive 0.13.0 起提供,保留重复值。
COLLECT_SETARRAY_AGG(DISTINCT expression)支持 collect_set(col)返回去重后的 array。
DATE_ADDDATEADD(d, num, 'day')支持 date_add(startdate, days)Hive 2.1.0 之前返回 string,之后返回 date。
DATE_FORMATTO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS')支持 date_format(ts, pattern)Hive 1.2.0 起提供,输入可以是 date、timestamp 或 string。
DATE_SUBd - interval '1 day'支持 date_sub(startdate, days)Hive 2.1.0 之前返回 string,之后返回 date。
DATEADDDATEADD(d, num, str)需改写 date_add(startdate, days) / add_months(startdate, n)内置函数中没有 DATEADD。按天加减用 date_add,按月加减用 add_months。
DATETRUNCDATE_TRUNC('month', ts)需改写 trunc(date, 'MM')函数手册中没有 date_trunc。trunc 只支持 MONTH、MON、MM 和 YEAR、YYYY、YY,返回 string。
EXPLODEUNNEST(anyarray)支持 explode(array | map)UDTF,数组展开为一列 col,map 展开为 key 和 value 两列。需要元素位置时用 posexplode,位置从 0 开始。
FROM_JSONjson_str::jsonb ->> 'key'需改写 json_tuple(jsonStr, k1, k2, ...)内置函数中没有 FROM_JSON。一次取多个 key 用 json_tuple,它是 UDTF,要配合 LATERAL VIEW 使用;取单个值用 get_json_object。
FROM_UNIXTIMETO_TIMESTAMP(seconds)支持 from_unixtime(unixtime[, pattern])输入为距 1970-01-01 00:00:00 UTC 的秒数,返回 string。
GETDATENOW() 或 CURRENT_TIMESTAMP别名 current_timestampHive 1.2.0 起提供,返回查询开始时的时间戳,同一查询中各次调用结果相同。unix_timestamp() 无参写法从 2.0 起已废弃,文档建议改用 CURRENT_TIMESTAMP。
INSTRSTRPOS(str, substr)支持 instr(str, substr)下标从 1 开始,找不到时返回 0,任一参数为 NULL 时返回 NULL。需要起始位置时用 locate(substr, str, pos)。
MAX_BYMAX_BY(x, y)需改写 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1函数手册中没有 MAX_BY,用窗口函数取每组第一行。
MAX_PTMAX_PT('table_name')不支持 函数手册中没有 MAX_PT。改写为 WHERE pt = (SELECT MAX(pt) FROM t)。
PERCENTILE_APPROXAPPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)支持 percentile_approx(col, p[, B])适用于浮点数在内的数值列,p 也可以传数组。B 默认 10000,列的不同值个数小于 B 时结果就是精确分位数。精确的 percentile 只支持整数列。
REGEXP_EXTRACT(REGEXP_MATCH(str, pattern))[n]支持 regexp_extract(subject, pattern, index)签名中 index 是必填参数,含义与 Java Matcher.group() 的下标相同。文档提醒 '\s' 匹配的是字母 s,匹配空白要写 '\\s'。
SIZEARRAY_LENGTH(arr, 1)支持 size(array_or_map)同一个函数可以处理 ARRAY 和 MAP,返回 INT。
SORT_ARRAYARRAY_SORT(anyarray)支持 sort_array(Array<T>)Hive 0.9.0 起提供,只能升序。
SPLITREGEXP_SPLIT_TO_ARRAY(str, pattern)支持 split(str, pat)返回 array,pat 是正则表达式。
SPLIT_PARTSPLIT_PART(str, delimiter, num)需改写 split(str, pat)[n - 1]内置函数中没有 SPLIT_PART。split 的第二个参数是正则表达式,返回数组,数组下标从 0 开始。
TO_CHARTO_CHAR(ts, 'YYYY-MM-DD HH24:MI:SS')需改写 date_format(ts, 'yyyy-MM-dd HH:mm:ss')内置函数中没有 TO_CHAR。date_format 使用 Java 风格格式符。
WM_CONCATSTRING_AGG(expression, delimiter)需改写 concat_ws(',', collect_list(col))函数手册中没有 WM_CONCAT,用 concat_ws 拼接 collect_list 的结果,顺序不固定。

可以改用原生函数

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

函数Hologres 写法Hive 写法Hive 说明
MONTHS_BETWEEN(EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b)支持 months_between(date1, date2)Hive 1.2.0 起提供。同一天或都是月末时返回整数,否则按 31 天折算并考虑时间部分,结果保留 8 位小数。
NVLCOALESCE(value, default_value)支持 NVL(value, default_value)Hive 0.11 起提供。
SUBSTRSUBSTRING(str FROM start FOR len)支持 substr(str, start[, len])substr('foobar', 4) 返回 bar。手册没有说明负数和 0 的处理。
UNIX_TIMESTAMPEXTRACT(EPOCH FROM ts)支持 unix_timestamp(date[, pattern])返回秒级 bigint。不带参数取当前时间的写法从 Hive 2.0 起已不推荐,建议用 CURRENT_TIMESTAMP。
WEEKOFYEAREXTRACT(WEEK FROM ts)支持 weekofyear(string date)返回 INT,可以传入日期或时间戳字符串。

迁移注意事项

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

ADD_MONTHS 按月加减

APPROX_COUNT_DISTINCT 近似去重计数

DATE_ADD 日期加减

DATE_FORMAT 日期格式化

DATE_SUB 日期减天数

DATEADD 按单位加减日期

DATETRUNC 日期截断

EXPLODE 数组展开为多行

FROM_UNIXTIME 时间戳转日期

GETDATE 获取当前时间

INSTR 查找子串位置

PERCENTILE_APPROX 近似分位数

REGEXP_EXTRACT 正则提取

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

SPLIT 字符串拆分

SPLIT_PART 按分隔符取第 N 段

TO_CHAR 日期转字符串

MONTHS_BETWEEN 相差月数

NVL 空值替换

SUBSTR 截取子串

UNIX_TIMESTAMP 日期转时间戳

WEEKOFYEAR 一年中的第几周

可以直接用的函数

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

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