comportamento de mutação do sparklyr com stringr

Nov 24 2020

Estou tentando usar o sparklyr para processar um arquivo de parquet.

a tabela é de estrutura:

tipo: str | tipo: str | tipo: chave str | requestid | Operação

Estou executando o código:

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

onde txt é uma moldura de faísca válida eu obtenho:

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

Alguma ideia do que está errado?

Respostas

edog429 Dec 01 2020 at 02:05

Esta questão foi mais ou menos tratada aqui .

Não acho que o stringr seja diretamente compatível com o sparklyr, infelizmente. Mas, em geral, o que você está tentando fazer pode ser resolvido de algumas maneiras.

  1. Com comandos de substring. Você pode pegar uma parte da corda que vem antes do seu intervalo (neste caso '') e então a parte que vem depois. por exemplo
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. Com uma matriz, você pode separar a coluna em uma lista de elementos usando 'dividir' e, em seguida, transformar cada elemento em uma coluna. por exemplo
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"))