SQL 方言通

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

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

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

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

需要改写的函数

函数Hive 写法Spark SQL 写法Spark SQL 说明
DATEADDdate_add(startdate, days) / add_months(startdate, n)需改写 ts + INTERVAL n HOURSpark 3.4.0 起有 dateadd(start_date, num_days),但只能加天数,没有单位参数。按小时、月等单位加减用 INTERVAL 字面量,按月也可以用 add_months。
DATETRUNCtrunc(date, 'MM')需改写 date_trunc('MONTH', ts)date_trunc 从 2.3.0 起提供,单位在前,返回 timestamp。只需要日期时可以用 trunc(date, fmt)。
FROM_JSONjson_tuple(jsonStr, k1, k2, ...)支持 from_json(jsonStr, schema[, options])Spark 2.2.0 起提供。schema 用 DDL 字符串,例如 'a INT, b DOUBLE'。options 可以指定 timestampFormat 等解析选项。
SPLIT_PARTsplit(str, pat)[n - 1]支持 split_part(str, delimiter, partNum)Spark 3.3.0 起提供。下标从 1 开始,负数从末尾数。越界返回空字符串,partNum 为 0 时报错,分隔符为空字符串时不切分。
TO_CHARdate_format(ts, 'yyyy-MM-dd HH:mm:ss')支持 to_char(expr, format)Spark 3.4.0 起提供。4.0 文档写明 expr 可以是日期时间,此时 format 使用 Java 风格格式符;更早的版本请按所用版本文档确认。也可以直接用 date_format。
WM_CONCATconcat_ws(',', collect_list(col))需改写 string_agg(expr[, delimiter]) WITHIN GROUP (ORDER BY ...)string_agg 和 listagg 从 Spark 4.0.0 起提供。更早的版本用 concat_ws(',', collect_list(expr))。

可以改用原生函数

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

函数Hive 写法Spark SQL 写法Spark SQL 说明
ANY_VALUEmax(col)支持 any_value(expr[, isIgnoreNull])Spark 3.4.0 起提供,结果不确定。isIgnoreNull 为 true 时只返回非 NULL 值,默认可能返回 NULL。
APPROX_COUNT_DISTINCTCOUNT(DISTINCT col)支持 approx_count_distinct(expr[, relativeSD])Spark 1.6.0 起提供,基于 HyperLogLog++。relativeSD 是允许的最大相对标准差。
DAYOFWEEKextract(dayofweek FROM ts)支持 dayofweek(date)Spark 2.3.0 起提供,周日为 1,周六为 7。weekday(date) 则以周一为 0、周日为 6。
DECODECASE expr WHEN search THEN result ... ELSE default END支持 decode(expr, search, result [, search, result ] ... [, default])多值匹配写法 3.2.0 起支持。没有匹配且省略 default 时返回 NULL。同名的 decode(bin, charset) 用于按字符集解码。
MAX_BYROW_NUMBER() OVER (PARTITION BY ... ORDER BY y DESC) = 1支持 max_by(x, y[, k])传入 k 时返回 y 最大的前 k 个 x 组成的数组,k 最大 100,000。y 全为 NULL 时返回 NULL。

迁移注意事项

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

DATEADD 按单位加减日期

DATETRUNC 日期截断

SPLIT_PART 按分隔符取第 N 段

TO_CHAR 日期转字符串

ANY_VALUE 取组内任意值

APPROX_COUNT_DISTINCT 近似去重计数

DAYOFWEEK 星期几

DECODE 多值匹配

可以直接用的函数

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

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