comportamiento mutado de sparklyr con stringr

Nov 24 2020

Estoy intentando utilizar sparklyr para procesar un archivo de parquet.

la mesa es de estructura:

tipo: str | tipo: str | tipo: clave str | requestid | operación

Estoy ejecutando el código:

txt %>%
     select(key, requestid, operation) %>%
     mutate(object = stringr::str_split(key, '/', simplify=TRUE) %>% dplyr::last() )

donde txt es un marco de chispa válido que obtengo:

Error in stri_split_regex(string, pattern, n = n, simplify = simplify, : object 'key' not found
Traceback:

1. txt2 %>% select(key, requestid, operation) %>% mutate(object = stringr::str_split(key, 
 .     "/", simplify = TRUE) %>% dplyr::last())
2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
3. eval(quote(`_fseq`(`_lhs`)), env, env)
4. eval(quote(`_fseq`(`_lhs`)), env, env)
5. `_fseq`(`_lhs`)
6. freduce(value, `_function_list`)
7. withVisible(function_list[[k]](value))
8. function_list[[k]](value)
9. mutate(., object = stringr::str_split(key, "/", simplify = TRUE) %>% 
 .     dplyr::last())
10. mutate.tbl_lazy(., object = stringr::str_split(key, "/", simplify = TRUE) %>% 
  .     dplyr::last())
11. partial_eval_dots(dots, vars = op_vars(.data))
12. lapply(dots, function(x) {
  .     new_quosure(partial_eval(get_expr(x), vars = vars, env = get_env(x)), 
  .         get_env(x))
  . })
13. FUN(X[[i]], ...)
14. new_quosure(partial_eval(get_expr(x), vars = vars, env = get_env(x)), 
  .     get_env(x))
15. partial_eval(get_expr(x), vars = vars, env = get_env(x))
16. partial_eval_call(call, vars, env)
17. lapply(call[-1], partial_eval, vars = vars, env = env)
18. FUN(X[[i]], ...)
19. partial_eval_call(call, vars, env)
20. eval_bare(call, env)
21. stringr::str_split(key, "/", simplify = TRUE)
22. stri_split_regex(string, pattern, n = n, simplify = simplify, 
  .     opts_regex = opts(pattern))

¿Alguna idea de lo que está mal?

Respuestas

edog429 Dec 01 2020 at 02:05

Esta cuestión se ha abordado más o menos aquí .

Desafortunadamente, no creo que Stringr sea directamente compatible con Sparklyr. Pero, en general, lo que está intentando hacer se puede resolver de varias formas.

  1. Con comandos de subcadena. Puede tomar una parte de la cuerda que viene antes de su descanso (en este caso '') y luego la parte que viene después. p.ej
temp <- data.frame(
          var1 = c("a_b","a_b")
          ,var2 = c(1,2)
)
sdf_copy_to(con,temp,"temp", overwrite = TRUE)

a <- sdf_sql(con,"select * from temp")

b <- a %>% 
     dplyr::mutate(var1_part1 = sql("substr(var1,1,position('_',var1)-1)")
             ,va1_part2 = sql("substr(var1,position('_',var1)+1,length(var1))"))
  1. Con una matriz, puede separar la columna en una lista de elementos usando 'dividir' y luego convertir cada elemento en una columna. p.ej
a <- sdf_sql(con,"select * from temp")
b <- a %>%
      dplyr::mutate(var1_array = split(var1,'_')) %>%
      sdf_separate_column("var1_array", into = c("var1_part1", "var1_part2"))