2017-12-10 5 views
2

私はsparkで新しい仕事をしています。スパークデータフレームの多数の列にベクトルの値を掛けたいと思います。これまでmtcarsを使って私はforループとmutate_atを以下のように使っていました:ベクトルを使用してDEFFの複数の列を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でうまくいきます。ただし、sql_renderに示されているように、ネストされたSQLクエリがsparkに送信され、多くのカラムで分解されます。この場合、dplyrを使用して単一のSQLクエリを送信できますか?

ところで、私はあまりにも高価になるのでデータを転置しないでください。どんな助けでも大歓迎です!結果を分離することができ

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

答えて

1

一般的に、あなたは、これはMLlibアルゴリズムの入力であれば、その後ft_elementwise_productと組み合わせるft_vector_assemblerがより良いフィットかもしれないしかし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

関連する問題