Spark regexp_extract() 失败 - 正则表达式组计数为 0,但指定的组索引为 1

问题描述 投票:0回答:1

我想提取字符串的最后一部分(在最后一个正斜杠之后)。 当我使用以下代码时,它失败并出现错误:

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, "(?<=/)[^/]*$")) %>%
  count(my_result)

java.lang.IllegalArgumentException:正则表达式组计数为 0,但 指定组索引为1

show_query()
显示以下查询:

<SQL>
SELECT `my_result`, COUNT(*) AS `n`
FROM (SELECT `my_string`, regexp_extract(`my_string`, "(?<=/)[^/]*$") AS `my_result`
FROM `test_regexp_extract`) `q01`
GROUP BY `my_result`

我怀疑这可能是正则表达式中的正斜杠字符的问题。我试图用反斜杠来转义它。
另一个想法是,由于某种原因,当未找到匹配项时,它会失败。根据 Spark 文档,它应该可以工作:

如果正则表达式不匹配,或者指定的组不匹配,则会出现 返回空字符串。

知道为什么会失败吗?在 R 中,相同的代码可以正常工作。

r regex apache-spark illegalargumentexception sparklyr
1个回答
1
投票

regexp_extract
默认返回第一组。您的正则表达式模式
(?<=/)[^/]*$
没有组,所以这就是问题所在。你可以:

  • 使用
    ()
    创建一个组,例如
    (?<=/)([^/]*)$
  • 0
    添加为函数的第三个参数:
    regexp_extract(my_string, "(?<=/)[^/]*$", 0)
    。这样,将返回完整的正则表达式匹配,而不是仅返回第一组。
© www.soinside.com 2019 - 2024. All rights reserved.