SQL 方言通

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

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

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

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

需要改写的函数

函数StarRocks 写法Hive 写法Hive 说明
ANY_VALUEANY_VALUE(expr)需改写 max(col)函数手册中没有 ANY_VALUE,组内值都相同时用 max 或 min 代替。
APPROX_COUNT_DISTINCTAPPROX_COUNT_DISTINCT(expr)需改写 COUNT(DISTINCT col)内置函数文档中没有近似去重函数,只能用精确的 COUNT(DISTINCT)。
COLLECT_LISTARRAY_AGG(col [ORDER BY ...])支持 collect_list(col)Hive 0.13.0 起提供,保留重复值。
COLLECT_SETARRAY_AGG(DISTINCT col)支持 collect_set(col)返回去重后的 array。
DATEADDTIMESTAMPADD(unit, n, datetime_expr)需改写 date_add(startdate, days) / add_months(startdate, n)内置函数中没有 DATEADD。按天加减用 date_add,按月加减用 add_months。
DATETRUNCdate_trunc('month', datetime)需改写 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。
EXPLODEFROM t, UNNEST(arr) AS u(x)支持 explode(array | map)UDTF,数组展开为一列 col,map 展开为 key 和 value 两列。需要元素位置时用 posexplode,位置从 0 开始。
FROM_JSONparse_json(str)需改写 json_tuple(jsonStr, k1, k2, ...)内置函数中没有 FROM_JSON。一次取多个 key 用 json_tuple,它是 UDTF,要配合 LATERAL VIEW 使用;取单个值用 get_json_object。
GETDATENOW([p])别名 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(x, y)需改写 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1函数手册中没有 MAX_BY,用窗口函数取每组第一行。
MONTHS_BETWEENmonths_diff(expr1, expr2)支持 months_between(date1, date2)Hive 1.2.0 起提供。同一天或都是月末时返回整数,否则按 31 天折算并考虑时间部分,结果保留 8 位小数。
NVLIFNULL(expr1, expr2)支持 NVL(value, default_value)Hive 0.11 起提供。
SIZEarray_length(arr) / map_size(m)支持 size(array_or_map)同一个函数可以处理 ARRAY 和 MAP,返回 INT。
SORT_ARRAYarray_sort(array)支持 sort_array(Array<T>)Hive 0.9.0 起提供,只能升序。
SPLIT_PARTsplit_part(content, delimiter, field)需改写 split(str, pat)[n - 1]内置函数中没有 SPLIT_PART。split 的第二个参数是正则表达式,返回数组,数组下标从 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] expr [ORDER BY ...] [SEPARATOR sep])需改写 concat_ws(',', collect_list(col))函数手册中没有 WM_CONCAT,用 concat_ws 拼接 collect_list 的结果,顺序不固定。

迁移注意事项

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

APPROX_COUNT_DISTINCT 近似去重计数

COLLECT_LIST 聚合为数组

COLLECT_SET 去重聚合为数组

DATEADD 按单位加减日期

DATETRUNC 日期截断

DAYOFWEEK 星期几

EXPLODE 数组展开为多行

FROM_JSON 按 schema 解析 JSON

GETDATE 获取当前时间

LENGTH 字符串长度

MAX_BY 取最大值对应的列

MONTHS_BETWEEN 相差月数

NVL 空值替换

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

SPLIT_PART 按分隔符取第 N 段

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

可以直接用的函数

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

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