2017-12-10 19 views
2

저는 스파크로 일하는 새로운 사람입니다. 스파크 데이터 프레임의 많은 수의 열에 벡터의 값을 곱하고 싶습니다.벡터를 사용하여 dEFF 스파크 DF의 여러 열을 수정할 수 있습니까?

library(dplyr) 
library(rlang) 
library(sparklyr) 

sc1 <- spark_connect(master = "local") 

mtcars_sp = sdf_copy_to(sc1, mtcars, overwrite = TRUE) 

mtcars_cols = colnames(mtcars_sp) 
mtc_factors = 0:10/10 

# mutate 1 col at a time 
for (i in 1:length(mtcars_cols)) { 
    # set equation and print - use sym() convert a string 
    mtcars_eq = quo(UQ(sym(mtcars_cols[i])) * mtc_factors[i]) 
    # mutate formula - LHS resolves to a string, RHS a quosure 
    mtcars_sp = mtcars_sp %>% 
     mutate(!!mtcars_cols[i] := !!mtcars_eq) 
} 

dbplyr::sql_render(mtcars_sp) 
mtcars_sp 

이 mtcars와 작품을 좋아 다음과 같이 지금까지 mtcars와 나는 루프 mutate_at에 대한 사용. 그러나 sql_render에 표시된 것처럼 중첩 된 SQL 쿼리가 spark로 전송되고 많은 열로 구분됩니다. 이 경우 단일 SQL 쿼리를 보내는 대신 dplyr를 사용할 수 있습니까?

나는 너무 비싸기 때문에 데이터를 조 변경하지 않을 것입니다. 어떤 도움을 많이 주시면 감사하겠습니다! 결과는 분리 할 수 ​​

scaled <- mtcars_sp %>% 
    ft_vector_assembler(mtcars_cols, "features") %>% 
    ft_elementwise_product("features", "features_scaled", mtc_factors) 

:

일반적으로

답변

1

당신은 더 잘 맞는 수 있습니다이 다음 ft_vector_assemblerft_elementwise_product과 함께 MLlib 알고리즘에 대한 입력은 그러나 경우 Artem Sokolov

library(glue) 

mtcars_sp %>% 
    mutate(!!! setNames(glue("{mtcars_cols} * {mtc_factors}"), mtcars_cols) %>% 
    lapply(parse_quosure)) 

에 의해 great answer을 사용할 수 있습니다 (당신이 MLlib과 함께한다면 권하고 싶지 않다) sdf_separate_column :

scaled %>% 
    select(features_scaled) %>% 
    sdf_separate_column("features_scaled", mtcars_cols) 
+0

고마워요! 나는 MLlib 알고리즘을 지금 사용하지 않고 있으므로 첫 번째 접근법이 완벽합니다. – swany