SQL 方言通

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

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

从 Doris 迁移到 Hive 时,在 Doris 有对应写法的 44 个常用函数中,18 个需要改写。逐个列出两边写法和注意事项。

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

需要改写的函数

函数Doris 写法Hive 写法Hive 说明
ADD_MONTHSMONTHS_ADD(date, nums)支持 add_months(start_date, num_months[, output_date_format])Hive 1.1.0 起提供,返回 string。Hive 4.0.0 之前会忽略时间部分,4.0.0 起可以指定输出格式。
ANY_VALUEANY_VALUE(expr)需改写 max(col)函数手册中没有 ANY_VALUE,组内值都相同时用 max 或 min 代替。
APPROX_COUNT_DISTINCTAPPROX_COUNT_DISTINCT(expr)需改写 COUNT(DISTINCT col)内置函数文档中没有近似去重函数,只能用精确的 COUNT(DISTINCT)。
DATEADDTIMESTAMPADD(unit, n, datetime_expr)需改写 date_add(startdate, days) / add_months(startdate, n)内置函数中没有 DATEADD。按天加减用 date_add,按月加减用 add_months。
DATETRUNCDATE_TRUNC(datetime, 'month')需改写 trunc(date, 'MM')函数手册中没有 date_trunc。trunc 只支持 MONTH、MON、MM 和 YEAR、YYYY、YY,返回 string。
DAYOFWEEKDAYOFWEEK(date)需改写 extract(dayofweek FROM ts)内置函数文档中没有 dayofweek 函数,Hive 2.2.0 起可以用 extract 取 dayofweek,文档示例中 2016-10-20(周四)返回 5,即周日为 1。
FROM_JSONJSON_PARSE(json_str)需改写 json_tuple(jsonStr, k1, k2, ...)内置函数中没有 FROM_JSON。一次取多个 key 用 json_tuple,它是 UDTF,要配合 LATERAL VIEW 使用;取单个值用 get_json_object。
GET_JSON_OBJECTGET_JSON_STRING(json_str, json_path)支持 get_json_object(json_string, path)
GETDATENOW([precision])别名 current_timestampHive 1.2.0 起提供,返回查询开始时的时间戳,同一查询中各次调用结果相同。unix_timestamp() 无参写法从 2.0 起已废弃,文档建议改用 CURRENT_TIMESTAMP。
LENGTHCHAR_LENGTH(str)支持 length(string A)返回字符串长度。Hive 2.2.0 起还有 character_length(简写 char_length)返回 UTF-8 字符数,octet_length 返回字节数。
MAX_BYMAX_BY(expr1, expr2)需改写 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1函数手册中没有 MAX_BY,用窗口函数取每组第一行。
SIZEARRAY_SIZE(arr) / MAP_SIZE(m)支持 size(array_or_map)同一个函数可以处理 ARRAY 和 MAP,返回 INT。
SORT_ARRAYARRAY_SORT(arr)支持 sort_array(Array<T>)Hive 0.9.0 起提供,只能升序。
SPLITSPLIT_BY_STRING(str, separator)支持 split(str, pat)返回 array,pat 是正则表达式。
SPLIT_PARTSPLIT_PART(str, separator, part_index)需改写 split(str, pat)[n - 1]内置函数中没有 SPLIT_PART。split 的第二个参数是正则表达式,返回数组,数组下标从 0 开始。
SUBSTRSUBSTRING(str, pos[, len])支持 substr(str, start[, len])substr('foobar', 4) 返回 bar。手册没有说明负数和 0 的处理。
TO_DATEstr_to_date(str, format)需改写 to_date(from_unixtime(unix_timestamp(str, pattern)))Hive 的 to_date 只返回时间戳字符串的日期部分,没有格式参数。返回类型在 Hive 2.1.0 之前是 string,之后是 date。
WM_CONCATGROUP_CONCAT([DISTINCT] str[, sep] [ORDER BY ...])需改写 concat_ws(',', collect_list(col))函数手册中没有 WM_CONCAT,用 concat_ws 拼接 collect_list 的结果,顺序不固定。

迁移注意事项

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

ADD_MONTHS 按月加减

ANY_VALUE 取组内任意值

APPROX_COUNT_DISTINCT 近似去重计数

DATETRUNC 日期截断

DAYOFWEEK 星期几

FROM_JSON 按 schema 解析 JSON

GET_JSON_OBJECT 提取 JSON 字段

GETDATE 获取当前时间

LENGTH 字符串长度

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

SPLIT 字符串拆分

SPLIT_PART 按分隔符取第 N 段

SUBSTR 截取子串

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

可以直接用的函数

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

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