SQL 方言通

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

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

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

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

需要改写的函数

函数Spark SQL 写法Hive 写法Hive 说明
ANY_VALUEany_value(expr[, isIgnoreNull])需改写 max(col)函数手册中没有 ANY_VALUE,组内值都相同时用 max 或 min 代替。
APPROX_COUNT_DISTINCTapprox_count_distinct(expr[, relativeSD])需改写 COUNT(DISTINCT col)内置函数文档中没有近似去重函数,只能用精确的 COUNT(DISTINCT)。
DATEADDts + INTERVAL n HOUR需改写 date_add(startdate, days) / add_months(startdate, n)内置函数中没有 DATEADD。按天加减用 date_add,按月加减用 add_months。
DATETRUNCdate_trunc('MONTH', ts)需改写 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。
DECODEdecode(expr, search, result [, search, result ] ... [, default])需改写 CASE expr WHEN search THEN result ... ELSE default ENDHive 的 decode(binary bin, string charset) 是按字符集把二进制解码为字符串,不能做多值匹配,需要用 CASE 改写。
FROM_JSONfrom_json(jsonStr, schema[, options])需改写 json_tuple(jsonStr, k1, k2, ...)内置函数中没有 FROM_JSON。一次取多个 key 用 json_tuple,它是 UDTF,要配合 LATERAL VIEW 使用;取单个值用 get_json_object。
MAX_BYmax_by(x, y[, k])需改写 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1函数手册中没有 MAX_BY,用窗口函数取每组第一行。
SPLIT_PARTsplit_part(str, delimiter, partNum)需改写 split(str, pat)[n - 1]内置函数中没有 SPLIT_PART。split 的第二个参数是正则表达式,返回数组,数组下标从 0 开始。
TO_CHARto_char(expr, format)需改写 date_format(ts, 'yyyy-MM-dd HH:mm:ss')内置函数中没有 TO_CHAR。date_format 使用 Java 风格格式符。
WM_CONCATstring_agg(expr[, delimiter]) WITHIN GROUP (ORDER BY ...)需改写 concat_ws(',', collect_list(col))函数手册中没有 WM_CONCAT,用 concat_ws 拼接 collect_list 的结果,顺序不固定。

迁移注意事项

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

ANY_VALUE 取组内任意值

APPROX_COUNT_DISTINCT 近似去重计数

DATEADD 按单位加减日期

DATETRUNC 日期截断

DAYOFWEEK 星期几

DECODE 多值匹配

SPLIT_PART 按分隔符取第 N 段

TO_CHAR 日期转字符串

可以直接用的函数

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

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