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真题
