La función regexp_extract() de Spark falla porque el recuento de grupos de la expresión regular es 0, pero el índice de grupo especificado es 1.
Me gustaría extraer la última parte de la cadena (después de la última barra inclinada hacia adelante).
Cuando uso el siguiente código, falla con el siguiente error:
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)
show_query()
muestra la siguiente consulta:
<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`
Sospecho que podría ser el problema del carácter de barra inclinada hacia adelante en la expresión regular. Intenté escaparlo con una barra invertida.
Otra idea es que por alguna razón falla cuando no se encuentra coincidencia. Según la documentación de Spark debería funcionar:
Si la expresión regular no coincide, o el grupo especificado no coincide, se devuelve una cadena vacía.
¿Alguna idea por qué falla? En R, el mismo código funciona bien.
davy.ai
El problema parece estar en el patrón regex
(?<=/)[^/]*$
, que está diseñado para coincidir con la última parte de la cadena después de la última barra diagonal. El mensaje de errorRegex group count is 0, but the specified group index is 1
sugiere que el patrón regex no está coincidiendo con ningún grupo, pero el código intenta extraer el primer grupo coincidente.Una posible solución es modificar el patrón regex para usar un grupo de captura alrededor de la coincidencia deseada, como
/(?P<last>[^/]+)$
. Esto capturará la última parte de la cadena como un grupo con nombre ‘last’, que se puede extraer utilizando la funciónregexp_extract
. El código actualizado podría lucir así:“`{r}
library(sparklyr)
library(tidyverse)
sc <- spark_connect(method = “databricks”)
tibble(my_string = c(“aaa/bbb/ccc”, “ddd/eee/fff”, “ggg/hhh/iii”)) %>%[^/]+)$”, 1)) %>%
copy_to(sc, ., “test_regexp_extract”, overwrite = TRUE) %>%
mutate(my_result = regexp_extract(my_string, “/(?P
count(my_result)
SELECT
my_result
, COUNT(*) ASn
FROM (SELECT
my_string
, regexp_extract(my_string
, ‘/(?Pmy_result
FROM
test_regexp_extract
)q01
GROUP BY
my_result
“`
Esto debería extraer la parte deseada de la cadena y contar las ocurrencias de cada valor.
No está claro por qué el patrón regex original no funcionó, pero una posibilidad es que el motor regex de Spark lo interpretara de manera diferente al motor regex de R, lo que llevó a un comportamiento diferente.