Spark中regexp_extract()报错:正则分组数为0但指定分组索引为1
报错原因
这个报错和正斜杠转义无关,核心问题出在Spark SQL regexp_extract 函数的实现逻辑上:
Spark的regexp_extract语法为regexp_extract(字符串, 正则表达式, 分组索引),第三个参数分组索引的默认值为1,要求正则表达式中必须存在对应编号的捕获组。你使用的正则(?<=/)[^/]*$只用到了零宽后向断言,没有定义任何显式捕获组,整个正则的分组总数为0,调用时取默认索引1就会触发分组索引不合法的报错。
本地R环境能正常运行,是因为本地dplyr或基础字符串处理函数的regexp_extract没有强制要求捕获分组,默认返回整个正则的匹配结果,和Spark SQL的函数规则不一致。
解决方法
把正则调整为带捕获组的版本即可,不需要修改其他逻辑:
library(sparklyr) library(tidyverse) sc <- spark_connect(method = "databricks") tibble(my_string = c("aaa/bbb/ccc", "ddd/eee/fff", "ggg/hhh/iii")) %>% copy_to(sc, ., "test_regexp_extract", overwrite = TRUE) %>% mutate(my_result = regexp_extract(my_string, "(?<=/)([^/]*$)", 1)) %>% count(my_result)
如果要兼容字符串不含正斜杠的场景,也可以用更简洁的写法:
mutate(my_result = regexp_extract(my_string, "([^/]+)$", 1))
内容的提问来源于stack exchange,提问作者Piotr K
相关产品推荐
相关产品推荐

