dplyr 可以使用向量修改 spark DF 的多列吗?
Can dplyr modify multiple columns of spark DF using a vector?
我是 spark 的新手。我想将 spark 数据帧的大量列乘以向量中的值。到目前为止,对于 mtcars,我使用了一个 for 循环和 mutate_at,如下所示:
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 查询被发送到 spark,如 sql_render 所示,并分解为许多列。在这种情况下,可以使用 dplyr 代替发送单个 SQL 查询吗?
顺便说一句,我宁愿不转置数据,因为它太昂贵了。任何帮助将不胜感激!
一般可以使用 by Artem Sokolov
library(glue)
mtcars_sp %>%
mutate(!!! setNames(glue("{mtcars_cols} * {mtc_factors}"), mtcars_cols) %>%
lapply(parse_quosure))
但是,如果这是 MLlib 算法的输入,那么 ft_vector_assembler
结合 ft_elementwise_product
可能更合适:
scaled <- mtcars_sp %>%
ft_vector_assembler(mtcars_cols, "features") %>%
ft_elementwise_product("features", "features_scaled", mtc_factors)
结果可以用 sdf_separate_column
:
分隔成单独的列(如果你使用 MLlib,我不建议这样做)
scaled %>%
select(features_scaled) %>%
sdf_separate_column("features_scaled", mtcars_cols)
我是 spark 的新手。我想将 spark 数据帧的大量列乘以向量中的值。到目前为止,对于 mtcars,我使用了一个 for 循环和 mutate_at,如下所示:
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 查询被发送到 spark,如 sql_render 所示,并分解为许多列。在这种情况下,可以使用 dplyr 代替发送单个 SQL 查询吗?
顺便说一句,我宁愿不转置数据,因为它太昂贵了。任何帮助将不胜感激!
一般可以使用
library(glue)
mtcars_sp %>%
mutate(!!! setNames(glue("{mtcars_cols} * {mtc_factors}"), mtcars_cols) %>%
lapply(parse_quosure))
但是,如果这是 MLlib 算法的输入,那么 ft_vector_assembler
结合 ft_elementwise_product
可能更合适:
scaled <- mtcars_sp %>%
ft_vector_assembler(mtcars_cols, "features") %>%
ft_elementwise_product("features", "features_scaled", mtc_factors)
结果可以用 sdf_separate_column
:
scaled %>%
select(features_scaled) %>%
sdf_separate_column("features_scaled", mtcars_cols)