sparklyr muta il comportamento con stringr

Nov 24 2020

Sto cercando di utilizzare Sparklyr per elaborare un file parquet.

il tavolo è di struttura:

tipo: str | tipo: str | tipo: str key | requestid | operazione

Sto eseguendo il codice:

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

dove txt è un frame spark valido che ottengo:

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))

qualche idea cosa c'è che non va?

Risposte

edog429 Dec 01 2020 at 02:05

Questa domanda è stata più o meno affrontata qui .

Sfortunatamente, non credo che stringr sia direttamente compatibile con sparklyr. Ma in generale ciò che stai cercando di fare può essere risolto in diversi modi.

  1. Con comandi di sottostringa. Puoi prendere una parte della corda che viene prima della tua pausa (in questo caso '') e poi la parte che viene dopo. per esempio
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 un array puoi separare la colonna in un elenco di elementi usando 'split' e quindi trasformare ogni elemento in una colonna. per esempio
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"))