SQL 方言通

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

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

从 Hologres 迁移到 MaxCompute 时,在 Hologres 有对应写法的 43 个常用函数中,19 个需要改写,另有 8 个可以改用 MaxCompute 的原生函数。逐个列出两边写法和注意事项。

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

需要改写的函数

函数Hologres 写法MaxCompute 写法MaxCompute 说明
ADD_MONTHSd + interval '1 month'支持 ADD_MONTHS(startdate, num_months)返回 yyyy-mm-dd 格式的 STRING,不是 DATE。格式不对时返回 NULL,例如 '20170214'。
APPROX_COUNT_DISTINCTAPPROX_COUNT_DISTINCT(column)别名 APPROX_DISTINCT(colname)MaxCompute 2.0 扩展函数,返回 BIGINT,文档写明会有 5% 的误差。
COLLECT_LISTARRAY_AGG(expression)支持 COLLECT_LIST(colname)值为 NULL 的行不参与计算,结果不保证顺序。官方建议拼接字符串时改用 WM_CONCAT。
COLLECT_SETARRAY_AGG(DISTINCT expression)支持 COLLECT_SET(colname)返回去重后的数组,值为 NULL 的行不参与计算。
DATE_ADDDATEADD(d, num, 'day')支持 DATE_ADD(startdate, delta)按天加减,delta 为负数时表示减。返回 DATE,输入的时间部分会被丢弃。需要按月、小时等单位加减时用 DATEADD。
DATE_FORMATTO_CHAR(timestamp, 'YYYY-MM-DD HH24:MI:SS')支持 DATE_FORMAT(date, format)返回 STRING。默认模式下分钟写 mi,写 mm 会输出月份;开启 Hive 兼容模式后分钟写 mm,写 mi 返回 NULL。DATE 和 STRING 输入需要开启 Hive 兼容模式。
DATE_SUBd - interval '1 day'支持 DATE_SUB(startdate, delta)delta 大于 0 时减,小于 0 时加。返回 DATE,输入的时间部分会被丢弃。startdate 为 NULL 时报错,delta 为 NULL 时返回 NULL。
DATETRUNCDATE_TRUNC('month', ts)支持 DATETRUNC(date, date_part)返回类型与输入相同。单位支持 yyyy、q、mm、week、isoweek、dd、hh、mi、ss、ff3,week 默认从周一开始,也可以写 week(sunday)。
EXPLODEUNNEST(anyarray)支持 EXPLODE(var)支持 array 和 map。同一个 SELECT 只能有一个 EXPLODE,也不能同时选其他列,不能与 GROUP BY 等一起使用。数组为 NULL 时不输出行。
FROM_JSONjson_str::jsonb ->> 'key'支持 from_json(jsonStr, schema)schema 写法与建表时的类型一致,例如 'a bigint, b double'、'array<bigint>'、'map<string,string>'。返回 ARRAY、MAP 或 STRUCT。STRUCT 的 key 区分大小写,缺失的 key 返回 NULL,类型不匹配的值会被忽略。
FROM_UNIXTIMETO_TIMESTAMP(seconds)支持 FROM_UNIXTIME(unixtime)输入为秒,返回 DATETIME。默认只接受一个参数;开启 Hive 兼容模式后可以传第二个参数指定格式。
GETDATENOW() 或 CURRENT_TIMESTAMP支持 GETDATE()返回 DATETIME,以东八区时间为标准。同一条 SQL 中总是返回固定值,精度到秒;开启 2.0 数据类型后精度到毫秒。
INSTRSTRPOS(str, substr)支持 INSTR(str1, str2[, start_position[, nth_appearance]])找不到时返回 0,str2 为空串时返回 1,任一参数为 NULL 时返回 NULL。start_position 为负数时从末尾倒数,nth_appearance 必须大于 0。
PERCENTILE_APPROXAPPROX_PERCENTILE(p) WITHIN GROUP (ORDER BY col)支持 PERCENTILE_APPROX(col[, weight], p[, B])MaxCompute 2.0 扩展函数。p 取 0~1,也可以传数组一次求多个分位数。B 是精度参数,默认 10000。可选的 weight 参数为每行指定权重。col 为 NULL 的行不参与计算,p 或 B 为 NULL 时报错。
REGEXP_EXTRACT(REGEXP_MATCH(str, pattern))[n]支持 REGEXP_EXTRACT(source, pattern[, group_id])group_id 默认为 1,为 0 时返回整个匹配。pattern 没有分组且不传 group_id 时会报错。Hive 兼容数据类型版本遵循 Java 正则规范,1.0 和 2.0 数据类型版本遵循 MaxCompute 自己的规范。
SIZEARRAY_LENGTH(arr, 1)支持 SIZE(array_or_map)同一个函数可以处理 ARRAY 和 MAP,返回 INT。
SORT_ARRAYARRAY_SORT(anyarray)支持 SORT_ARRAY(a[, isasc])isasc 默认为 True,即升序,传 False 时降序。NULL 视为最小值。
SPLITREGEXP_SPLIT_TO_ARRAY(str, pattern)支持 SPLIT(source, delimiter[, trimTailEmpty])返回 ARRAY<STRING>。分隔符支持正则表达式。trimTailEmpty 默认为 true,会去掉末尾的空字符串。任一参数为 NULL 时返回 NULL。
WM_CONCATSTRING_AGG(expression, delimiter)支持 WM_CONCAT(separator, colname)分隔符必须是常量且写在前面。支持 DISTINCT 和 WITHIN GROUP (ORDER BY ...),值为 NULL 的行不参与计算。

可以改用原生函数

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

函数Hologres 写法MaxCompute 写法MaxCompute 说明
ANY_VALUEMAX(col)支持 ANY_VALUE(colname)值为 NULL 的行不参与计算,不保证返回哪一行。
DAYOFWEEKEXTRACT(DOW FROM ts) + 1支持 DAYOFWEEK(date)返回 1~7,1 是周日,7 是周六。WEEKDAY(date) 则以周一为 0、周日为 6。
DECODECASE expr WHEN search THEN result ... ELSE default END支持 DECODE(expression, search, result[, search, result]...[, default])没有匹配且没有 default 时返回 NULL。所有 result 的类型必须一致,search 与 expression 的类型也必须一致,否则报错。在 DECODE 中 NULL 与 NULL 视为相等。
MONTHS_BETWEEN(EXTRACT(YEAR FROM a) - EXTRACT(YEAR FROM b)) * 12 + EXTRACT(MONTH FROM a) - EXTRACT(MONTH FROM b)支持 MONTHS_BETWEEN(end_date, start_date)返回 DOUBLE,end_date 晚于 start_date 时为正。两个日期都是月末时返回整数,否则按天数差除以 31 折算。
NVLCOALESCE(value, default_value)支持 NVL(value, default_value)文档要求两个参数的数据类型一致。
SUBSTRSUBSTRING(str FROM start FOR len)支持 SUBSTR(str, start_position[, length])从 1 开始计数,负数从末尾倒数。start_position 为 0 时返回空字符串;Hive 兼容模式和 BigQuery 兼容模式下按 1 处理。length 为 0 或负数时返回空字符串。
UNIX_TIMESTAMPEXTRACT(EPOCH FROM ts)支持 UNIX_TIMESTAMP(date)输入可以是 DATETIME、DATE、TIMESTAMP 或固定格式的字符串,返回秒级 BIGINT,小数秒会被丢弃。不支持格式参数。新类型系统下字符串需要先 CAST 为 DATETIME。
WEEKOFYEAREXTRACT(WEEK FROM ts)支持 WEEKOFYEAR(date[, date_part])默认周一为一周的第一天,1 月 1 日所在周有 4 天及以上属于当年时算作第一周。date_part 可以传 week(sunday) 等指定一周的起始日,或传 isoweek。

迁移注意事项

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

ADD_MONTHS 按月加减

APPROX_COUNT_DISTINCT 近似去重计数

COLLECT_LIST 聚合为数组

COLLECT_SET 去重聚合为数组

DATE_ADD 日期加减

DATE_FORMAT 日期格式化

DATE_SUB 日期减天数

DATETRUNC 日期截断

EXPLODE 数组展开为多行

FROM_JSON 按 schema 解析 JSON

FROM_UNIXTIME 时间戳转日期

GETDATE 获取当前时间

INSTR 查找子串位置

PERCENTILE_APPROX 近似分位数

REGEXP_EXTRACT 正则提取

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

SPLIT 字符串拆分

WM_CONCAT 分组拼接字符串

ANY_VALUE 取组内任意值

DAYOFWEEK 星期几

DECODE 多值匹配

MONTHS_BETWEEN 相差月数

NVL 空值替换

SUBSTR 截取子串

UNIX_TIMESTAMP 日期转时间戳

WEEKOFYEAR 一年中的第几周

可以直接用的函数

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

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