SQL 方言通

首页 / 工具 / 迁移清单 / Flink SQL → Hive

Flink SQL 迁移到 Hive 的函数改写清单

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

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

需要改写的函数

函数Flink SQL 写法Hive 写法Hive 说明
ADD_MONTHSTIMESTAMPADD(MONTH, n, timepoint)支持 add_months(start_date, num_months[, output_date_format])Hive 1.1.0 起提供,返回 string。Hive 4.0.0 之前会忽略时间部分,4.0.0 起可以指定输出格式。
ANY_VALUEFIRST_VALUE(expression)需改写 max(col)函数手册中没有 ANY_VALUE,组内值都相同时用 max 或 min 代替。
COLLECT_LISTARRAY_AGG(expression)支持 collect_list(col)Hive 0.13.0 起提供,保留重复值。
COLLECT_SETARRAY_AGG(DISTINCT expression)支持 collect_set(col)返回去重后的 array。
DATE_ADDTIMESTAMPADD(DAY, n, timepoint)支持 date_add(startdate, days)Hive 2.1.0 之前返回 string,之后返回 date。
DATE_SUBTIMESTAMPADD(DAY, -n, timepoint)支持 date_sub(startdate, days)Hive 2.1.0 之前返回 string,之后返回 date。
DATEADDTIMESTAMPADD(unit, n, timepoint)需改写 date_add(startdate, days) / add_months(startdate, n)内置函数中没有 DATEADD。按天加减用 date_add,按月加减用 add_months。
DATEDIFFTIMESTAMPDIFF(DAY, timepoint1, timepoint2)支持 datediff(enddate, startdate)返回 int,表示从 startdate 到 enddate 的天数。
DATETRUNCFLOOR(timepoint TO 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。
EXPLODECROSS JOIN UNNEST(arr) AS t(x)支持 explode(array | map)UDTF,数组展开为一列 col,map 展开为 key 和 value 两列。需要元素位置时用 posexplode,位置从 0 开始。
FROM_JSONJSON_VALUE(json, path) / JSON_QUERY(json, path)需改写 json_tuple(jsonStr, k1, k2, ...)内置函数中没有 FROM_JSON。一次取多个 key 用 json_tuple,它是 UDTF,要配合 LATERAL VIEW 使用;取单个值用 get_json_object。
GET_JSON_OBJECTJSON_VALUE(json, path)支持 get_json_object(json_string, path)
GETDATECURRENT_TIMESTAMP 或 NOW()别名 current_timestampHive 1.2.0 起提供,返回查询开始时的时间戳,同一查询中各次调用结果相同。unix_timestamp() 无参写法从 2.0 起已废弃,文档建议改用 CURRENT_TIMESTAMP。
LAST_DAYTIMESTAMPADD(DAY, -1, TIMESTAMPADD(MONTH, 1, FLOOR(ts TO MONTH)))支持 last_day(date)Hive 1.1.0 起提供,返回 string。
LENGTHCHAR_LENGTH(string)支持 length(string A)返回字符串长度。Hive 2.2.0 起还有 character_length(简写 char_length)返回 UTF-8 字符数,octet_length 返回字节数。
MONTHS_BETWEENTIMESTAMPDIFF(MONTH, start, end)支持 months_between(date1, date2)Hive 1.2.0 起提供。同一天或都是月末时返回整数,否则按 31 天折算并考虑时间部分,结果保留 8 位小数。
NVLIFNULL(input, null_replacement)支持 NVL(value, default_value)Hive 0.11 起提供。
PERCENTILE_APPROXPERCENTILE(expr, percentage[, frequency])支持 percentile_approx(col, p[, B])适用于浮点数在内的数值列,p 也可以传数组。B 默认 10000,列的不同值个数小于 B 时结果就是精确分位数。精确的 percentile 只支持整数列。
SIZECARDINALITY(array_or_map)支持 size(array_or_map)同一个函数可以处理 ARRAY 和 MAP,返回 INT。
SORT_ARRAYARRAY_SORT(array[, ascending_order[, null_first]])支持 sort_array(Array<T>)Hive 0.9.0 起提供,只能升序。
SPLIT_PARTSPLIT_INDEX(str, delimiter, n - 1)需改写 split(str, pat)[n - 1]内置函数中没有 SPLIT_PART。split 的第二个参数是正则表达式,返回数组,数组下标从 0 开始。
WEEKOFYEARWEEK(date)支持 weekofyear(string date)返回 INT,可以传入日期或时间戳字符串。
WM_CONCATLISTAGG(expression[, separator])需改写 concat_ws(',', collect_list(col))函数手册中没有 WM_CONCAT,用 concat_ws 拼接 collect_list 的结果,顺序不固定。

迁移注意事项

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

ADD_MONTHS 按月加减

DATE_ADD 日期加减

DATE_SUB 日期减天数

DATEDIFF 日期差

DATETRUNC 日期截断

DAYOFWEEK 星期几

EXPLODE 数组展开为多行

GETDATE 获取当前时间

LAST_DAY 当月最后一天

LENGTH 字符串长度

MONTHS_BETWEEN 相差月数

NVL 空值替换

PERCENTILE_APPROX 近似分位数

SIZE 数组和 Map 元素个数

SORT_ARRAY 数组排序

SPLIT_PART 按分隔符取第 N 段

可以直接用的函数

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

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