2017-12-10 8 views
2

Ich bin neu mit Funken arbeiten. Ich möchte eine große Anzahl von Spalten eines Spark-Datenrahmens mit Werten in einem Vektor multiplizieren. Bisher habe ich bei mtcars eine for-Schleife und muate_at wie folgt verwendet:Kann man mehrere Spalten von Funken DF mit einem Vektor modifizieren?

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 

Das funktioniert ok mit mtcars. Dies führt jedoch dazu, dass verschachtelte SQL-Abfragen an den Funke gesendet werden, wie in sql_render gezeigt, und mit vielen Spalten zusammenfällt. Kann in diesem Fall statt einer einzigen SQL-Abfrage dplyr verwendet werden?

BTW, ich würde lieber nicht die Daten transponieren, da es zu teuer wäre. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Im Allgemeinen können Sie great answer von Artem Sokolov

library(glue) 

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

jedoch verwenden, wenn dieser Eingang für MLlib Algorithmen ist dann mit ft_elementwise_product kombiniert ft_vector_assembler könnte eine bessere Passform sein:

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

Das Ergebnis getrennt werden können (Ich würde nicht empfehlen, wenn Sie mit MLlib gehen) in einzelne Spalten mit sdf_separate_column:

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

Danke dafür! Ich benutze die MLlib Algorithmen für jetzt nicht, also ist der erste Ansatz für mich perfekt. – swany

Verwandte Themen