私は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)
:
ありがとうございます!私は今のところMLlibアルゴリズムを使用していないので、最初のアプローチは私にとって完璧です。 – swany