SQL 方言通

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

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

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

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

需要改写的函数

函数Hive 写法StarRocks 写法StarRocks 说明
COLLECT_LISTcollect_list(col)需改写 ARRAY_AGG(col [ORDER BY ...])在 StarRocks 文档中搜索不到 COLLECT_LIST。ARRAY_AGG 会保留 NULL,3.0 起支持 ORDER BY 指定元素顺序。
COLLECT_SETcollect_set(col)需改写 ARRAY_AGG(DISTINCT col)在 StarRocks 文档中搜索不到 COLLECT_SET。ARRAY_AGG_DISTINCT 是 ARRAY_AGG(DISTINCT) 的别名。ARRAY_AGG 会保留 NULL。
DATEADDdate_add(startdate, days) / add_months(startdate, n)需改写 TIMESTAMPADD(unit, n, datetime_expr)单位写成关键字,例如 HOUR、DAY、MONTH,不加引号。TIMESTAMPADD 文档没有列出 QUARTER;按季度加减可以用 DATE_ADD(dt, INTERVAL n QUARTER)。
DATETRUNCtrunc(date, 'MM')需改写 date_trunc('month', datetime)单位在前且必须是常量。DATE 输入只能截断到 year、quarter、month、week、day。
EXPLODEexplode(array | map)需改写 FROM t, UNNEST(arr) AS u(x)UNNEST 是表函数,配合横向连接使用,不需要写 LATERAL。NULL 或空数组不输出行;3.2.7 起可以用 LEFT JOIN ... ON TRUE 保留这些行。
FROM_JSONjson_tuple(jsonStr, k1, k2, ...)需改写 parse_json(str)没有 FROM_JSON。parse_json 返回 JSON 类型,而不是 STRUCT 或 MAP。字符串不是合法 JSON 时返回 NULL。取字段可以接 json_query 或 -> 运算符。
GETDATEcurrent_timestamp别名 NOW([p])别名有 current_timestamp、localtime 和 localtimestamp,返回 DATETIME,默认精度到秒。3.1.6 起可以传 1~6 指定秒后的小数位数。结果受时区设置影响。
LENGTHlength(string A)需改写 char_length(str)LENGTH 返回的是字节数。按字符计数要用 char_length,别名 character_length,目前只支持 UTF-8。
MONTHS_BETWEENmonths_between(date1, date2)需改写 months_diff(expr1, expr2)函数列表中没有 MONTHS_BETWEEN。months_diff 返回 expr1 减 expr2 的月数,类型是 BIGINT,只精确到月;日期不存在时返回 NULL。
NVLNVL(value, default_value)需改写 IFNULL(expr1, expr2)条件函数列表中没有 NVL,只有 case、coalesce、if、ifnull 和 nullif。IFNULL 的结果类型与 expr1 一致。
SIZEsize(array_or_map)别名 array_length(arr) / map_size(m)数组用 array_length,别名 cardinality,3.0 起提供,NULL 元素也计入长度,输入为 NULL 时返回 NULL。Map 用 map_size,2.5 起提供,别名同样是 cardinality。
SORT_ARRAYsort_array(Array<T>)需改写 array_sort(array)升序排列,NULL 放在开头。4.0 起可以传 Lambda 比较函数自定义顺序。
SPLIT_PARTsplit(str, pat)[n - 1]支持 split_part(content, delimiter, field)正数从开头数,负数从末尾数,-1 表示最后一段。下标越界时,官方示例返回空字符串。
TO_DATEto_date(from_unixtime(unix_timestamp(str, pattern)))需改写 str_to_date(str, format)StarRocks 的 to_date 只接受 DATETIME 并取日期部分,不能解析字符串。按格式解析用 str_to_date,格式符与 date_format 相同;格式只含日期时返回 DATE,否则返回 DATETIME。
WM_CONCATconcat_ws(',', collect_list(col))需改写 GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR sep])默认分隔符是逗号,跳过 NULL。结果长度受 group_concat_max_len 限制,默认 1,024 个字符,超出部分会被截断。

可以改用原生函数

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

函数Hive 写法StarRocks 写法StarRocks 说明
ANY_VALUEmax(col)支持 ANY_VALUE(expr)返回值不确定。3.2 起支持 ARRAY、MAP 和 STRUCT 类型。
APPROX_COUNT_DISTINCTCOUNT(DISTINCT col)支持 APPROX_COUNT_DISTINCT(expr)结果近似于 COUNT(DISTINCT col),使用固定大小的内存,适合高基数列。
DAYOFWEEKextract(dayofweek FROM ts)支持 dayofweek(date)周日为 1,周一为 2,周六为 7。
MAX_BYROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1支持 max_by(x, y)2.5 起提供。y 为 NULL 的行被忽略,并列时返回最先遇到的 x。y 不能是 bitmap、hll 等不可排序的类型。

迁移注意事项

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

COLLECT_LIST 聚合为数组

COLLECT_SET 去重聚合为数组

DATEADD 按单位加减日期

DATETRUNC 日期截断

EXPLODE 数组展开为多行

FROM_JSON 按 schema 解析 JSON

GETDATE 获取当前时间

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

SPLIT_PART 按分隔符取第 N 段

TO_DATE 字符串转日期

WM_CONCAT 分组拼接字符串

APPROX_COUNT_DISTINCT 近似去重计数

DAYOFWEEK 星期几

MAX_BY 取最大值对应的列

可以直接用的函数

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

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