在Hive中处理字符串时,split 函数几乎是不可或缺的工具。它的核心作用十分直观:按照指定的分隔符将字符串拆解成数组。然而,实际应用中有不少细节需要留意,不同业务场景需要选择最恰当的拆分方式。

首先介绍最基础的用法——默认分隔符。函数签名为 split(string str, string pattern),其中 pattern 是正则表达式。但在日常开发中,经常直接使用逗号、竖线等常见字符作为分隔符。例如:
SELECT split('hive,hadoop,spark', ',') FROM table;
执行结果返回 ["hive", "hadoop", "spark"]。当然,如果分隔符本身是正则表达式中的特殊字符,就需要使用后面介绍的转义方法。
接下来是自定义分隔符并限制数组长度。这个功能在某些场景下非常实用——例如只需要前两个元素,其余部分保留原样。对应的函数是多了一个 limit 参数的版本:split(string str, string pattern, int limit)。看这个示例:
SELECT split('hive,hadoop,spark', ',', 2) FROM table;
结果变为 ["hive", "hadoop,spark"]。第二个元素将剩余所有内容合并在一起,不再继续拆分。这在数据清洗阶段很常见,比如日志中前几个字段是固定长度的,而后面的描述信息长度可变。
再来谈谈正则表达式作为分隔符。Hive 的 split 本质上支持正则,因此可以采用更灵活的方式拆分。例如字符串用短横线连接:
SELECT split('hive-hadoop-spark', '-') FROM table;
结果同样是 ["hive", "hadoop", "spark"]。这里的 - 并非正则中的特殊符号,直接使用即可。但如果分隔符是 .、|、* 这类正则元字符,直接书写就会出错——因为正则会将 . 解释为“匹配任意字符”。此时就需要转义字符登场了。
在 Hive 的 split 中,若要匹配正则中的特殊字符,必须在它们前面加上反斜杠 \ 进行转义。需要注意的是,由于 Hive 的 SQL 解析中反斜杠本身也是一个转义符,因此实际编写时需要使用双反斜杠才能表达一个真正的反斜杠。例如字符串 'hive\-hadoop\-spark' 中包含的是字面意义上的横线(已被反斜杠转义),要正确拆分它,应写成:
SELECT split('hive\-hadoop\-spark', '\-') FROM table;
结果返回 ["hive-hadoop-spark"]——注意这里只有一个元素,因为 \\- 这个正则匹配的是 - 字符,而原字符串中的横线前面都带有一个反斜杠,所以实际上字符串里没有独立的横线,拆分后整个字符串变成了一个数组元素。这个案例很好地揭示了转义的细节:如果要拆分的字符本身就是反斜杠加横线的组合,那么分隔符也必须匹配反斜杠加横线的模式。实际编写时很容易混淆,建议先在本地小范围测试验证。
总体而言,Hive 的 split 函数用法虽然简单,但扩展性很强。掌握默认分隔符、带 limit 的拆分、正则拆分以及转义技巧,基本就能覆盖日常遇到的绝大多数字符串拆分需求。再配合 lateral view explode,解析日志、处理 CSV、拆分 key-value 列表都不在话下。
