跳到主要内容

split:字符串拆分为数组

速查结论

split(str, regex[, limit]) 是 Spark SQL 中用于按正则表达式拆分字符串为数组的函数。regex 使用 Java 正则表达式语法,limit 控制结果数组的最大长度。注意:Spark 2.0+ 中正则反斜杠需要双重转义。

语法

split(str, regex[, limit])

参数说明

参数说明
str待拆分的字符串表达式
regex正则表达式分隔符(Java 正则语法)
limit可选,控制结果数组最大长度。limit > 0 时结果数组不超 limit,末尾条目包含剩余全部内容;limit <= 0 时尽可能多地拆分

返回值:字符串数组(ARRAY<STRING>)。

Since: 1.5.0

示例

基础拆分

-- 按正则 [ABC] 拆分
SELECT split('oneAtwoBthreeC', '[ABC]');
-- 结果: ["one", "two", "three", ""]

limit 参数

-- limit -1:尽可能多拆分(同默认行为)
SELECT split('oneAtwoBthreeC', '[ABC]', -1);
-- 结果: ["one", "two", "three", ""]

-- limit 2:最多拆为2个元素
SELECT split('oneAtwoBthreeC', '[ABC]', 2);
-- 结果: ["one", "twoBthreeC"]

实际业务场景

-- 拆分 CSV 行
SELECT split('a,b,c,d', ',');
-- 结果: ["a", "b", "c", "d"]

-- 拆分后取第n个元素
SELECT split('John Doe', ' ')[0] AS first_name;
-- 结果: John

split vs regexp_extract vs substring_index 对比

函数返回类型用途适用场景
split(str, regex)ARRAY拆分为数组多段拆分,取任意段
regexp_extract(str, regex, idx)STRING提取匹配组只取一个匹配组
substring_index(str, delim, count)STRING按分隔符截取简单的非正则分隔

常见报错与避坑指南

Spark 2.0+ 正则双重转义

在 Spark 2.0+ 中,正则表达式中的反斜杠需要双重转义。例如匹配数字 \d 要写成 \\d

-- 错误写法:\d 被当作普通字符
SELECT split('one1two2three', '\d');

-- 正确写法:\\d 才是正则中的 \d
SELECT split('one1two2three', '\\d');
-- 结果: ["one", "two", "three"]

拆分结果末尾空字符串

当字符串以分隔符结尾时,结果数组末尾包含空字符串。

-- 末尾有分隔符,结果包含空字符串
SELECT split('a,b,', ',');
-- 结果: ["a", "b", ""]
📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看